как игнорировать косую черту в замене preg

Скажем, у меня есть 2 варианта ссылки, которые публикуются на моем сайте …

(разница в конце /)

После отправки сообщений на мой сайт они превращаются в гиперссылки, которые выглядят следующим образом:

<a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>

Я установил preg replace, чтобы перехватывать ссылки на лозы и конвертировать их во встраивания (это сообщение будет содержать более очевидно, но это, например, ради:

$this->post['message'] = '<a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>';

$drc_embed_vine =  '<iframe src="https://vine.co/v/\2/embed/simple" width="480" height="480" frameborder="0"></iframe>';

$this->post['message'] = preg_replace('~(<a href="https?://vine.co)/v/(.*)" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $this->post['message']);

Я использую подстановочный знак (.*) что я думал, означало «НИЧЕГО», но по какой-то причине, если ссылка размещена с косой чертой, она не конвертируется …

Я попытался изменить мой reg ex на (всего пару примеров, которые я пробовал)

~(<a href="https?://vine.co)/v/(.*)/" target="_blank">(https?://vine.co)/v/(.*)/<\/a>~

который затем преобразует ссылку с обратной косой чертой и игнорирует без нее.

~(<a href="https?://vine.co)/v/(.*)/?" target="_blank">(https?://vine.co)/v/(.*)/?<\/a>~

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

затем сказал, эй, подождите, это не в рег экс, поэтому я попробовал, как

~(<a href="https?://vine.co)/v/(.*/?)" target="_blank">(https?://vine.co)/v/(.*/?)<\/a>~

Но все равно не повезло.

Как я могу заставить мою замену не заботиться о том, есть ли обратный слеш или нет?

2

Решение

Если вам нужна только эта очень специфическая замена, вы можете просто объединить строки.

$message = rtrim($post['message'], '/');
$message = sprintf('<iframe src="%s/embed/simple" width="480" height="480" frameborder="0"></iframe>', $message);

Или, если вы действительно хотите использовать preg_replace:

$pattern = '~https?://vine.co/v/([^/]+)~';
$this->post['message'] = preg_replace($pattern, $drc_embed_vine, $this->post['message']);

Ваш шаблон должен соответствовать входной строке ($this->post['message']). Затем поместите соответствующий результат ($1) в последней строке.

Чтобы не обращать внимания на конечную косую черту, просто учтите, что идентификатор видео никогда не будет содержать косую черту: очевидно, это буквенно-цифровой [a-zA-Z0-9], Мы берем все символы, кроме косой черты с ([^/]+), Вы могли бы использовать ([a-z0-9]) с i модификатор.

Вы создали шаблон для последней строки и пытаетесь сопоставить его с входной строкой.

Этот скрипт:

<?php
$message = 'https://vine.co/v/iF20jKHvnqg/';

$drc_embed_vine = '<iframe src="https://vine.co/v/\1/embed/simple" width="480" height="480" frameborder="0"></iframe>';

$pattern = '~https?://vine.co/v/([^/]+)/?~';

echo preg_replace($pattern, $drc_embed_vine, $message);

производит это:

<iframe src="https://vine.co/v/iF20jKHvnqg/embed/simple" width="480" height="480" frameborder="0"></iframe>

РЕДАКТИРОВАТЬ

На основе вашего комментария, вот новый шаблон, чтобы соответствовать ссылке на представленный URL:

$pattern = '~^(<[^>]+>)https?://vine.co/v/([^/]+)/?(</a>)$~';

Эта модель может соответствовать <a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>,

Строка замены немного меняется:

'<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'

Итак, у меня есть этот тестовый скрипт, который заменит ссылку, как вы упомянули в iframe:

<?php

$message = '<a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>';

$drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>';

$pattern = '~^(<[^>]+>)https?://vine.co/v/([^/]+)/?(</a>)$~';

echo preg_replace($pattern, $drc_embed_vine, $message);
1

Другие решения

Ответив на другой вопрос, который я задал, он не игнорирует косую черту, а просто удаляет все вместе.

$this->post['message'] = preg_replace('+/(["<])+', '$1', $this->post['message']);

rtrim не может работать, так как / не последняя строка.

1

Вот пример парсера:

$string = '<a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>';
$doc = new DOMDocument();
$doc->loadHTML($string);
$links = $doc->getElementsByTagName('a');
foreach($links as $link) {
if(preg_match('~^https?://vine\.co/v/([^/]+)~', $link->getAttribute('href'), $url)){
echo '<iframe src="https://vine.co/v/' . $url[1] . '/embed/simple" width="480" height="480" frameborder="0"></iframe>';
}
}

Выход:

<iframe src="https://vine.co/v/iF20jKHvnqg/embed/simple" width="480" height="480" frameborder="0"></iframe>

Демо-версия: https://eval.in/569642

0
По вопросам рекламы [email protected]