Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вывести из текста слово с символом @

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
vanicon
Отправлено: 20 Декабря, 2011 - 20:42:06
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




Есть текст и в нем нужно выбрать все слова которые начинаются со знака @ и поместить их в массив. Например текст:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Связывает функцию с @событием mouseout для каждого @элемента набора. Событие @mouseout обычно вызывается, когда указатель мыши выходит за пределы элемента

То здесь в массив должны занестись слова: событием,элемента,mouseout.


-----
Так было, так есть и так будет
 
 Top
DlTA
Отправлено: 20 Декабря, 2011 - 21:23:17
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




и, в чем проблема?
 
 Top
vanicon
Отправлено: 20 Декабря, 2011 - 21:32:25
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




В том что проблему надо решать с помощью регулярки, я не могу ее составить, вот на javascript была регулярка:
но на php не выходит...


-----
Так было, так есть и так будет
 
 Top
EuGen Администратор
Отправлено: 20 Декабря, 2011 - 21:58:30
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. $sText='this @big text @in utf8 codepage';
  2. preg_match_all('/\@[^\s]+/mu', $sText, $rgMatches);
  3. //var_dump($rgMatches);

Если текст не в utf8, уберите модификатор u


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vanicon
Отправлено: 21 Декабря, 2011 - 00:14:36
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




EuGen, Спасибо Вам большое, просто самому с регулярками тяжело пока...


-----
Так было, так есть и так будет
 
 Top
duhon
Отправлено: 21 Декабря, 2011 - 10:37:46
Post Id



Гость


Покинул форум
Сообщений всего: 72
Дата рег-ции: Нояб. 2011  


Помог: 5 раз(а)




EuGen пишет:
'/\@[^\s]+/mu'

пару вопросов
1) зачем слешить @ если регекс в одиночных кавычках?
2) зачем сложная [^\s] если есть \S?
3) зачем модификатор m если нету ^ и $?
4) зачем модификатор u если в регексе нету намека на использование расширенной таблицы символов?

З.ы. я не подправляю, просто чувствую что чего то не понимаю. Возможно это какието оптимизации?
 
 Top
EuGen Администратор
Отправлено: 21 Декабря, 2011 - 11:14:31
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




1. От кавычек не зависят специальные символы и символы масок (например, что в одинарных, что в двойных кавычках символ * будет означать "от 0 и более повторений"). @ в данном случае - просто не alphanumeric, я привык такие экранировать.
2. Чтобы отделить логический смысл. Иными словами, мне нагляднее читать "идти до тех пор, пока не встретится символ разрыва", чем "повторение всех символов, исключая пробельный". Дело вкуса
3. Потому что есть \s.
http://ru.php.net/manual/en/refe...rn.modifiers.php пишет:
If there are no "\n" characters in a subject string, or no occurrences of ^ or $ in a pattern, setting this modifier has no effect.
- однако же в \s оно входит.
4. Моя привычка - если строка в UTF - то и работать с ней как с UTF.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
duhon
Отправлено: 27 Декабря, 2011 - 18:43:26
Post Id



Гость


Покинул форум
Сообщений всего: 72
Дата рег-ции: Нояб. 2011  


Помог: 5 раз(а)




1. Частично не соглашусь, от кавычек зависит что нужно экранировать. В какой то статье писалось что неправильное экранирование идет во вред регуряке по 3 причинам.
a) регурка делает лишние телодвижение что бы определить что экранировать ничего не нужно и что это не метасимвол.
b) в будущем \@ может стать метасимволом, и тогда регулярка после обновления вылетит с ошибкой.
с) регулярка стает менее читабельной, из за лишнего-ненужного символа, полюс порождает мысль что это неизвестный тебе метосимвол.(я вот задумался и просмотрел опять мануал, в поисках что за метопоследовательность)
2. Тут согласен. Но для новичков я бы посоветовал использовать \S, так как [^...] дополнительные телодвижения для механизма PCRE, в сторону производительности и внутрених оптимизаций.
3. Тут вообще не согласен. В мануале имелось введу про то что если в искомом тексте нету перевода строки, то ^ и $ не меняют свое повидение, или если в искомой строке есть переводы строк но нету ^ и $, тоже не имеет смысла. Буду очень рад если ты примером докажешь обратное.
4. С утфом в регексах от версии к версии все как то не стабильно, но использование u подключает нехилую таблицу юникода, да и не все еще перешли на utf-8

З.Ы. написал ответ просто для информационности новичков

(Отредактировано автором: 27 Декабря, 2011 - 18:45:51)

 
 Top
EuGen Администратор
Отправлено: 27 Декабря, 2011 - 18:51:17
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




По оптимизации - такое верно при тексте больших объемах или самом выражении большого объема (скажем, бывают сами регулярные выражения объемом в несколько сот килобайт). В данном случае роли не играет, и, например, насчет пункта 4 - не соглашусь, т.к. если я использую модификатор u то я спокойно могу добавлять что в строку что в выражение символы кириллицы, к примеру (не беспокоясь о том, что там сработает неверно - это универсальность).
По поводу 1 - если @ станет метасимволом, то как раз таки регулярное выражение продолжит свою работу так, как задумано (например, . ? * и т.п. экранируются именно с этой целью). Если я указываю \@ то это и означает @ - так как если экранирование применяется к символам, не являющимися специальными, то оно просто игнорируется а символы остаются как есть (отсюда у меня и привычка все спец. символы экранировать - ничего не теряется, а на будущее есть запас). Так что это скорее антиаргумент с Вашей стороны.
Единственное, что не могу проверить - войдет ли \n в \s в случае наличия оного и модификатора m. Если войдет (как я предполагаю), то использование m вполне оправдано.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB