2009-11-20 4 views
1

Я ищу строку для URL-адресов ... и мой preg_match дает мне неправильное количество совпадений для моей демонстрационной строки.preg_match возвращает странные результаты

Строка:

Эй, пришел проверить мой сайт на www.example.com

Функция:

preg_match("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t<]*)#ise", $string, $links); 
echo count($links); 

Результат выходит как 3.

Может ли кто-нибудь помочь мне решить эту проблему? Я новичок в REGEX.

+0

Можете ли вы объяснить, как вы пытаетесь обнаружить URL-адрес и какой результат вы ожидали? Похоже, вы пытаетесь обнаружить «: //», но ваша строка не содержит этого. –

+0

Модификатор * e * используется только для 'preg_replace'. – Gumbo

+0

Проверьте возвращаемое значение 'preg_match', чтобы увидеть, соответствует ли regexp чему-либо. –

ответ

5

$links является array of sub matches:

Если matches предоставляется, она заполнена с результатами поиска. $matches[0] будет содержать текст, сопоставляемый с полным рисунком, $matches[1] будет иметь текст, который соответствует первому захваченному подшаблону в скобках и т. Д.

Матчи двух групп плюс совпадение полного регулярного выражения приводят к трем элементам массива.

Возможно, вам будет полезна ко всем матчам с помощью preg_match_all.

1

Если вы используете preg_match_pattern (как предлагалось Gumbo), обратите внимание, что если вы запустите регулярное выражение для этой строки, оно будет соответствовать значению вашего атрибута привязки «href», а также связанного текста, который в этом случае происходит с получением URL-адреса. Это делает ДВА матчей.

Было бы целесообразно, чтобы запустить array_unique на вашем результирующем :)

+0

отличная идея .. .благодаря! – johnnietheblack

0

В дополнение к советам о том, как использовать preg_match, я считаю, что что-то серьезно не так с регулярным выражением, который вы используете. Вы можете попробовать что-то вроде этого, вместо:

preg_match("_([a-zA-Z]+://)?([0-9a-zA-Z$-\_.+!*'(),]+\.)?([0-9a-zA-Z]+)+\.([a-zA-Z]+)_", $string, $links); 

Это должно обрабатывать в большинстве случаев (хотя это не будет работать, если была строка запроса после домена верхнего уровня). В будущем при написании регулярных выражений я рекомендую следующие веб-сайты: http://www.regular-expressions.info/ и особенно http://regexpal.com/ для тестирования их при написании.

 Смежные вопросы

  • Нет связанных вопросов^_^