2012-06-17 2 views
2

Это является образец текста:PHP Regex: текст матч URLs до пробела или конца строки

$text = "asd dasjfd fdsfsd http://11111.com/asdasd/?s=423%423%2F gfsdf http://22222.com/asdasd/?s=423%423%2F 
asdfggasd http://3333333.com/asdasd/?s=423%423%2F"; 

Это мой регулярное выражение схеме:

preg_match_all("#http:\/\/(.*?)[\s|\n]#is", $text, $m); 

, которые соответствуют первым двум URLs, но как соответствовать ли я последнему? Я попытался добавить [\ s | \ n | $], но это также будет соответствовать только первым двум URL-адресам.

+0

Не работает. Что бы это ни значило. Я уверен, что шаблон всегда работает. – hakre

+0

@hakre это не соответствует 3-му URL, только первые два. –

+0

'' 'используются в'() 'не в' [] ', чтобы сказать * или *. Вы пробовали: '(\ s | \ n | $)' или '(?: \ S | \ n | $)'? ('?:' делает группу несоответствующей) - также вы можете просто добавить пробел в '$ text';) – hakre

ответ

2

Не пытайтесь сопоставить \n (там нет разрыва строки!) И вместо этого используйте $ (который будет соответствовать концу строки).

Редактировать: Мне очень хотелось бы услышать, почему моя первоначальная идея не работает, поэтому на случай, если вы это знаете, сообщите мне. Я думаю, потому что [] пытается сопоставить один символ, а конец строки не один? :)

Это одна будет работать:

preg_match_all('#http://(\S+)#is', $text, $m); 

Обратите внимание, что вам не придется бежать/из-за них не является ограничивающим характером, но вы должны были бы спасаясь от \, как вы» re, используя двойные кавычки (так что строка разбирается). Вместо этого я использовал одинарные кавычки для этого.

+0

"#http: \/\/(. *?) [\ S | \ n | $] # is" не будет соответствовать третьему URL-адресу для меня. –

+0

Интересно, попробуйте сейчас. Это действительно не соответствует (также, как упоминалось выше, | устарело (и интерпретируется как другое возможное значение в '[]'). – Mario

+0

В квадратных скобках '$' соответствует литералу '$', точно так же, как ' | 'соответствует буквенному' ''. Вам нужно будет искать '(\ s | $)', как предположил @dsrekab ('\ n' является избыточным, так как это один из символов, совпадающий с' \ s'). Но я думаю, что теперь вы делаете это лучше. –

0

Я не знакомый с PHP, поэтому у меня нет точного синтаксиса, но, возможно, это даст вам что-то попробовать. [] означает класс символов, так что $ будет буквально искать $. Я думаю, что вам нужно, это еще один смотреть вперед, так что-то вроде этого:

#http:\/\/(.*)(?=(\s|$)) 

Я прошу прощения, если это далеко, но, возможно, это даст вам еще один угол, чтобы попробовать.

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