2014-05-30 4 views
3

Я использую PHP и Regex ниже, чтобы искать через огромную строку дляRegex заменить теги в строку в PHP

[LINK]www.anyurl.com[/LINK] 

и заменить его:

<a href="http://www.anyurl.com">http://www.anyurl.com</a> 

НТТР:// добавляется, если http или ftp уже не существует перед URL-адресом.

$re = '/\[LINK]((?:(?!(http|ftp)|\[\/LINK]).)*)\[\/LINK]/i'; 
$subst = '[LINK]http://$1[/LINK]'; 
$xtext = preg_replace($re, $subst, $xtext, 1); 
$xtext = preg_replace("/(\[LINK\])(\S*)(\[\/LINK])/", "<a href=\"$2\" target='_blank'>$2</a>", $xtext); 

Моя проблема в том, что только кажется работать на первом матче он приходит и не другой [LINK]www.urls.com[/LINK] в документе. Документ $xtext

+5

Я сейчас не мудрее, но спасибо, что прокомментировал – MikeC

+0

Изложить на @j_mcnally [regex is not for everything] (http://stackoverflow.com/a/1732454/2370483) – Machavity

+0

https: //gist.github. com/jbroadway/2836900 – cgTag

ответ

0

Я думаю, что ваша проблема может быть жадностью вашего первого регулярного выражения. Когда вы добавите http: // к вашей первой найденной ссылке, все остальные ссылки останутся прежними. Поэтому, пожалуйста (обратите внимание на дополнительную вопросительный в первой линии):

$re = '/\[LINK]((?:(?!(http|ftp)|\[\/LINK]).)*?)\[\/LINK]/i'; 
$subst = '[LINK]http://$1[/LINK]'; 
$xtext = preg_replace($re, $subst, $xtext); 
$xtext = preg_replace("/(\[LINK\])(\S*)(\[\/LINK])/", "<a href=\"$2\" target='_blank'>$2</a>", $xtext); 
0

В первом выражении 1 необходимо удалить, как вы уже выяснили. Обратите внимание, что второе выражение совпадает с вашим вторым выражением, но с * заменено на +?, а ненужные группы захвата вокруг тегов удалены. * не останавливается на первом [\LINK], но на последнем, что приводит к ссылке с текстом отображения, например http://www.google.com[/LINK]\n[LINK]http://www.yahoo.com, поэтому +? не требуется.

$xtext = '[LINK]www.google.com[/LINK]\n[LINK]www.yahoo.com[/LINK]'; 

$re = '/\[LINK]((?:(?!(http|ftp)|\[\/LINK]).)*)\[\/LINK]/i'; 
$subst = '[LINK]http://$1[/LINK]'; 
$xtext = preg_replace($re, $subst, $xtext, 1); 

$xtext = preg_replace("/\[LINK\](\S+?)\[\/LINK]/", "<a href='$1' target='_blank'>$1</a>", $xtext); 
+0

Это не учитывает отсутствующий файл 'http: //' –

+0

. Вы не проверяете, имеет ли ссылка в первую очередь http или ftp. Mine проверяет, есть ли ссылка [LINK] www.example.com [/ LINK] или [LINK] http://www.example.com [/ LINK], и если это первая, она добавляет http: // к ней. – MikeC

+0

@MikeC, теперь он делает. – developerwjk

1

Упс, я только что нашел свою ошибку, и все так просто. В моей третьей строке:

$xtext = preg_replace($re, $subst, $xtext, 1); 

У меня есть 1 в конце preg_replace, т.е. Это должно быть установлено равным -1 или оставлено пустым, чтобы заменить все.

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