Скажем, у меня есть 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>~
Но все равно не повезло.
Как я могу заставить мою замену не заботиться о том, есть ли обратный слеш или нет?
Если вам нужна только эта очень специфическая замена, вы можете просто объединить строки.
$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);
Ответив на другой вопрос, который я задал, он не игнорирует косую черту, а просто удаляет все вместе.
$this->post['message'] = preg_replace('+/(["<])+', '$1', $this->post['message']);
rtrim не может работать, так как / не последняя строка.
Вот пример парсера:
$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