2012-11-25 3 views
1

у меня есть регулярное выражение, которое находит URLs в тексте и заменяет их со ссылкамиPHP регулярное выражение, чтобы запретить слишком короткий URLs

preg_replace('@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0" target="_blank" rel="nofollow">\0</a>', $text); 

Проблема заключается в том, когда кто-то типы текста, который содержит «то есть» он преобразует его также к ссылке, которой не должно быть. Как ограничить это регулярное выражение, чтобы заменить строки длиной более 3 символов?

Я попытался поставить {3,}, но он не работает.

preg_replace('@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.) 
([-A-Z0-9+&#/%=~_|$?!:,.]{3,})*[A-Z0-9+&#/%=~_|$]@i', ' 
<a href="\0" target="_blank" rel="nofollow">\0</a>', $text); 

ответ

2

вы можете использовать preg_replace_callback, чтобы проверить, если текст захвачен имеет, по крайней мере, 5 или 6 символы:

preg_replace_callback('@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)([-A-Z0-9+&#/%=~_|$?!:,.]{3,})*[A-Z0-9+&#/%=~_|$]@i', function($matches){ 
    if(strlen($matches[0])>5){ 
     return '<a href="'.$matches[0].'" target="_blank" rel="nofollow">'.$matches[0].'</a>'; 
    }else{ 
     return $matches[0]; 
    } 
    }, $text); 
+0

Великие, это работает! просто ребята помните, чтобы поставить «return» перед preg_replace_callback, если у вас есть этот код, завернутый в функцию text_to_url ($ text) –

+1

, конечно, вы должны поставить оператор return, если вы его обернете. Но это не было в вашем вопросе – artragis

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