PHP Preg Replace не работает ПОСЛЕ разрыва строки - PullRequest
0 голосов
/ 06 ноября 2019

Иметь код, который получает текстовый файл, заменяет разрывы строк, затем ссылки и затем хэш-теги.

Когда хэш-тег следует за разрывом строки, он не заменяет хэш-тег. Не уверен, где в regrex это терпит неудачу.

// replace line breaks
$txt = str_replace('&lt;br /&gt;','<br />',$txt);

// replace links
$txt = preg_replace_callback('@(https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?)@', function($m) { return '<a href="'.$m[1].'" target="_blank">'.substr($m[1], 0, 30).'...</a>'; }, $txt);

// replace hashtags
$txt = preg_replace('/(?<!\S)#([0-9a-zA-Z]+)/m', '<a href="index.php?q=$1">#$1</a>', $txt);

1 Ответ

1 голос
/ 06 ноября 2019

(?<!\S) означает, что символ перед хэштегом должен быть символом пробела (не непробельным (\S)). > в <br /> не соответствует этому требованию. Вы, вероятно, можете сойти с рук, утверждая, что символ перед хэштегом не является символом word ([A-Za-z0-9_]):

$txt = preg_replace('/(?<!\w)#([0-9a-zA-Z]+)/m', '<a href="index.php?q=$1">#$1</a>', $txt);

Демонстрация на 3v4l.org

...