2016-05-12 3 views
1

Это почти такая же информация, как и предыдущая статья, но это другой вопрос.remove trailing slash from hyperlink href

У меня есть переменная $this->post['message'], которая является тем, что публикует пользователь.

Если посты пользователя:

Check out this vine https://vine.co/v/iF20jKHvnqg/ 

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

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

и это то, что $this->post['message'] равно.

Так что в моем заднем конце я создал плагин

$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']); 

Это находит виноградные ссылки в сообщениях и преобразует их в качестве фрейма. Однако я столкнулся с проблемой с косой чертой.

Если пользователь отправляет https://vine.co/v/iF20jKHvnqg, который после отправки превращается в <a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a>, он преобразуется в штрафную iframe.

Но если пользователь отправляет https://vine.co/v/iF20jKHvnqg/, который изменяется на <a href="https://vine.co/v/iF20jKHvnqg/" target="_blank">https://vine.co/v/iF20jKHvnqg/</a>, он не преобразуется. Разница заключается в завершении косой черты.

Теперь я попробовал:

$this->post['message'] = rtrim($this->post['message'],"/"); 

$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']); 

Но это, кажется, не работает, есть ли способ я могу предназначаться лозы ссылки внутри из $this->post['message'] и удалить слэш, или даже удалить слэш из любая ссылка в $this->post['message']

Итак, если

$this->post['message'] = 'Go to <a href="http://stackoverflow.com/questions/ask/" target="_blank">http://stackoverflow.com/questions/ask/</a>'; 

Это стало бы

$this->post['message'] = 'Go to <a href="http://stackoverflow.com/questions/ask" target="_blank">http://stackoverflow.com/questions/ask</a>'; 

В настоящее время я сосредоточен главным образом на связях Vine, но если это возможно для всех ссылок, которые могут работать лучше в долгосрочной перспективе.

Моя последняя неудачная попытка (я все еще пытаюсь понять это)

$drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'; 
$str = $this->post['message']; 
$str = rtrim($str, '/'); 
$str = preg_replace('~(<a href="https?://vine.co)/v/(.*)" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $str); 

Пытались что-то другое Только возни я дал это выстрел

$str = $this->post['message']; 
$str = rtrim($str, '/'); 

$this->post['message'] = $str; 

Так должность

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

и rtrim не имели никакого эффекта =/

, но если я изменю

$this->post['message'] = $str; 

в

$this->post['message'] = test; 

каждый пост превращается в TEST так что я не понимаю, почему RTRIM не имеет effect =/

обновление для обеспечения чистоты

$this->post['message'] = 'Check out this vine <a href="http://vine.co/v/iF20jKHvnqg/" target="_blank">http://vine.co/v/iF20jKHvnqg/</a>'; 
$drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'; 
$str = $this->post['message']; 
$str = rtrim($str, '/'); 
$str = preg_replace('~(<a href="https?://vine.co)/v/(.*)" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $str); 

РАБОЧЕЕ ОБНОВЛЕНИЕ!

После Richards ответа я играл с плагин немного и придумал

$drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'; 
$this->post['message'] = preg_replace('+/(["<])+', '$1', $this->post['message']); 
$this->post['message'] = preg_replace('~(<a href="https?://vine.co)/v/(.*)" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $this->post['message']); 

ЭТО РАБОТАЕТ! =) но это самый эффективный способ ...?

+0

Можете ли вы создать более простой пример без всех разговоров, что еще не работает? Я не вижу, куда конвертируется сообщение $ this-> post ['message']. Очевидно, что rtrim не будет работать, если переменная заканчивается. – Richard

+0

Я добавлю что-то к OP, чтобы его отформатировать лучше, что вам еще нужно? –

+0

Добавлен небольшой пример –

ответ

1

Смотрите пример ниже. Я думаю, ваш вопрос слишком сложный, и я не вижу кода, что он обрабатывает замену $ post -> ['message'] или создает ссылку для iframe.

Но я пытался получить пример как можно проще, чтобы имитировать эту проблему, что вы пытаетесь решить

// input 
$user = 'Check out this vine https://vine.co/v/iF20jKHvnqg/'; 
$after = 'Check out this vine <a href="https://vine.co/v/iF20jKHvnqg/" target="_blank">https://vine.co/v/iF20jKHvnqg/</a>'; 

// todo 
$trim_user = rtrim($user, '/'); 
$trim_after = preg_replace('+/(["<])+', '$1', $after); 

// output 
echo "trim_user $trim_user\n"; 
echo "trim_after $trim_after\n"; 

так есть 2 входа, которые вы можете иметь - исходное сообщение от пользователь в $ user или замененный текст с HTML-ссылками в $ after.

Тогда на пользователе $, я просто тестирую rtrim, который работает.

На $ после, мне нужно заменить все вхождение/до »или <. Это из-за кавычками„“в и закрывающий тег. Я замена обоих с одним регулярным выражением.

Смотрите параметры 1 - регулярное выражение для соответствия шаблону, второе - замена совпадающего рисунка, я пропускаю косую черту/и использую только вторую часть, которую мне нужно сохранить.

[] квадратные скобки в regexp означает группу символов - как [abc] - любой символ a, b или c. Если есть - это диапазон. Подобно [az] - это что-то между a и z.

() скобки означают группу, которая будет храниться в $ 1, $ 2, $ 3 на основе порядка группы. В этом случае есть только 1 группа, поэтому я имею в виду это как 1 доллар.

Другими словами/и любой символ из "и < будет заменен на" буфер обмена "$ 1. Это снова либо" или <.

Последняя вещь, я пишу вывод на консоль.

trim_user Check out this vine https://vine.co/v/iF20jKHvnqg 
trim_after Check out this vine <a href="https://vine.co/v/iF20jKHvnqg" target="_blank">https://vine.co/v/iF20jKHvnqg</a> 

Edited основе на примере

Вы можете избежать захвата/на [^ /] * вместо. * В().

class Example 
{ 

    public function run() 
    { 
     $this->post['message'] = 'Check out this vine <a href="http://vine.co/v/iF20jKHvnqg/" target="_blank">http://vine.co/v/iF20jKHvnqg/</a>'; 
     $drc_embed_vine = '<iframe src="https://vine.co/v/$2/embed/simple" width="480" height="480" frameborder="0"></iframe>'; 
     $str = $this->post['message']; 
     $str = rtrim($str, '/'); 
     $str = preg_replace('~(<a href="https?://vine.co)/v/([^/]*)/?" target="_blank">(https?://vine.co)/v/(.*)<\/a>~', $drc_embed_vine, $str); 

     echo $str; 
    } 
} 

$example = new Example(); 
$example->run(); 
+0

ahh Я понимаю, что вы имеете в виду сообщение, я использую CMS, vBulletin, если быть точным, '$ this-> post ['message']' просто равно тому, что когда-либо было опубликовано пользователем, до этого дочитал ваше сообщение, хотя =) –

+0

Это не было прямой ответ, но я получил результаты =) Позвольте мне заглядывать с ним очень быстро, и я отправлю обратно, чтобы обновить вас, СПАСИБО! –

+0

См. Ответ снова после жирного Отредактированного заголовка. – Richard

0

Попробуйте

$str = $this->post['message']; 
$str = rtrim($str, '/'); 
+0

Кажется, что он должен работать, основываясь на этом ответе, я попробовал '$ drc_embed_vine = ' '; $ str = $ this-> post ['message']; $ str = rtrim ($ str, '/'); $ str = preg_replace ('~ ( (https?: //vine.co)/v (. *)/<\/a> ~ ', $ drc_embed_vine, $ str); 'но это не сработало =/ –

+0

Я буду добавлять вещи, которые я пытаюсь использовать для OP, поэтому он структурирован лучше =) –

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