Замена ссылок на слово+ссылка

266
15 февраля 2018, 16:24

Идея такая, в ckeditor отправляется различный текст. Если есть "голые" ссылки вида:

https://domen.ru/43654766587878787?dlinnaya+ssylka

то меняем их на слово "ссылка" и саму ссылку вида:

<a href="https://link.ru/43654766587878787?dlinnaya+ssylka" class="link" target="_blank">ссылка</a>

с этой задачей я справился, НО у меня в ckeditor так же используется подсветка синтаксиса (вставка кода) вообщем моя замена меняет ссылки и в куске кода. Этот код начинается с

<pre><code class="...

и заканчивается соответственно:

<code><pre>

Нужно дописать регулярное выражение, чтобы была проверка на отсутствие вначале и в конце этих вставок. То есть внутри code ничего не меняем, остальное проверяем. Как я не пытался, у меня не вышло. Вот моя замена ссылок:

$message = preg_replace('@((https?://)?([-\\w]+\\.[-\\w\\.]+)+\\w(:\\d+)?(/([-\\w/_\\.]*(\\?\\S+)?)?)*)@', '<a href="http://$1" class="link" target="_blank">ссылка</a>', $message);

Это сообщение приходит на вебсокет, обрабатывается, сохраняется в БД и отправляется красивый текст обратно в окно клиенту.

Answer 1

Нужно дописать регулярное выражение, чтобы была проверка на отсутствие вначале и в конце этих вставок. То есть внутри code ничего не меняем, остальное проверяем

Можно конечно ещё подумать над составлением шаблона, но можно пойти и не много другим путём:

$str = '
    <a href="#">Линк</a> Текст 1
    https://domen.ru/43654766587878787?dlinnaya+ssylka Текст 2
    <pre><code>
    https://domen.ru/43654766587878787?dlinnaya+ssylka
    <a href="#">Линк</a>
    </code></pre>
';

Сначала найти и сохранить в переменную весь блок <pre><code>...</code></pre>

preg_match('~<pre><code[^>]*>.+?</code></pre>~s', $str, $code);

Потом произвести замену всех ссылок (в том числе и ссылок внутри тега <a>)

$str = preg_replace('~https?://\S+|<a[^>]*>.+?</a>~', 'Ссылка', $str);

И напоследок заменить блок <pre><code>...</code></pre> на ранее сохранённый его аналог

$str = preg_replace('~<pre><code[^>]*>.+?</code></pre>~s', $code[0], $str);
echo $str;

Результат:

Ссылка Текст 1
Ссылка Текст 2
<pre><code>
https://domen.ru/43654766587878787?dlinnaya+ssylka
<a href="#">Линк</a>
</code></pre>
READ ALSO
Парсинг JSON в PHP

Парсинг JSON в PHP

Отправляю на серв данные c помощью axios в JSONФорма генериться с помощью VueJS

214
php curl api метод

php curl api метод

Здравствуйте! Подскажите,пожалуйста, как задать метод(InfoCard) в запросе

199
Подстановка переменной php в getElementById

Подстановка переменной php в getElementById

Как правильно сделать подстановку id (берется из массива php $IdLotItem) в javascript при обращении к форме? Пример:

210
Не обновляется автоматически пакет на packagelist

Не обновляется автоматически пакет на packagelist

Я создал свой первый пакет для packagistСделал репозиторий на гитхабе с composer

192