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
Форумы портала PHP.SU :: Версия для печати :: Вывести из текста слово с символом @
Форумы портала PHP.SU » PHP » Регулярные выражения » Вывести из текста слово с символом @

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

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

То здесь в массив должны занестись слова: событием,элемента,mouseout.
2. DlTA - 20 Декабря, 2011 - 21:23:17 - перейти к сообщению
и, в чем проблема?
3. vanicon - 20 Декабря, 2011 - 21:32:25 - перейти к сообщению
В том что проблему надо решать с помощью регулярки, я не могу ее составить, вот на javascript была регулярка:
но на php не выходит...
4. EuGen - 20 Декабря, 2011 - 21:58:30 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $sText='this @big text @in utf8 codepage';
  2. preg_match_all('/\@[^\s]+/mu', $sText, $rgMatches);
  3. //var_dump($rgMatches);

Если текст не в utf8, уберите модификатор u
5. vanicon - 21 Декабря, 2011 - 00:14:36 - перейти к сообщению
EuGen, Спасибо Вам большое, просто самому с регулярками тяжело пока...
6. duhon - 21 Декабря, 2011 - 10:37:46 - перейти к сообщению
EuGen пишет:
'/\@[^\s]+/mu'

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

З.ы. я не подправляю, просто чувствую что чего то не понимаю. Возможно это какието оптимизации?
7. EuGen - 21 Декабря, 2011 - 11:14:31 - перейти к сообщению
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.
8. duhon - 27 Декабря, 2011 - 18:43:26 - перейти к сообщению
1. Частично не соглашусь, от кавычек зависит что нужно экранировать. В какой то статье писалось что неправильное экранирование идет во вред регуряке по 3 причинам.
a) регурка делает лишние телодвижение что бы определить что экранировать ничего не нужно и что это не метасимвол.
b) в будущем \@ может стать метасимволом, и тогда регулярка после обновления вылетит с ошибкой.
с) регулярка стает менее читабельной, из за лишнего-ненужного символа, полюс порождает мысль что это неизвестный тебе метосимвол.(я вот задумался и просмотрел опять мануал, в поисках что за метопоследовательность)
2. Тут согласен. Но для новичков я бы посоветовал использовать \S, так как [^...] дополнительные телодвижения для механизма PCRE, в сторону производительности и внутрених оптимизаций.
3. Тут вообще не согласен. В мануале имелось введу про то что если в искомом тексте нету перевода строки, то ^ и $ не меняют свое повидение, или если в искомой строке есть переводы строк но нету ^ и $, тоже не имеет смысла. Буду очень рад если ты примером докажешь обратное.
4. С утфом в регексах от версии к версии все как то не стабильно, но использование u подключает нехилую таблицу юникода, да и не все еще перешли на utf-8

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

 

Powered by ExBB FM 1.0 RC1