a link or even

PHP обнаруживает текст ссылки в html, содержащий строку, и переносит вокруг нее несколько символов

php function replace hyperlink wrap

59 просмотра

3 ответа

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

Например.

//beginning of string
$string = '
This is random <b>html code</b> which at some point can contain <a href="page.php">a link</a> or even <a href="page2.php" class="link">multiple links</a>.
<br>
But it also contains other <i>random</i> html tags.
';
//end of string

Вышеприведенная строка будет отображать html, как показано ниже:

================================================

Это случайный HTML-код, который в какой-то момент может содержать ссылку или даже несколько ссылок .

Но он также содержит другие случайные HTML-теги.

================================================

Но мне нужно, чтобы это выглядело так:

================================================

Это случайный HTML-код, который в какой-то момент может содержать ## ссылку ## или даже ## несколько ссылок ## .

Но он также содержит другие случайные HTML-теги.

================================================

Поскольку href и класс тега могут различаться, я думаю, что лучшим способом было бы иметь функцию, которая ищет закрывающий тег и выбирает все перед ним до последнего символа открывающего тега, который >

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

This is <a href="page.php">a new linktext</a>

... тогда обнаружи это ...

>a new linktext</a>

... и заменить его на ...

>##a new linktext##</a>

... и вернуть все это ...

This is <a href="page.php">##a new linktext##</a>

Но, конечно, любой другой подход к работе также приветствуется.

Автор: DanielM Источник Размещён: 17.05.2019 02:35

Ответы (3)


3 плюса

Решение

Ну, вам нужно использовать DOMDocument для анализа вашей HTML-строки и обработки только тегов привязки. Вы можете изменить их innerHTML и сохранить их в конце, чтобы получить модифицированный HTML с желаемым выводом.

<?php 

$html_string = 'This is random <b>html code</b> which at some point can contain <a href="page.php">a link</a> or even <a href="page2.php" class="link">multiple links</a>.
<br>But it also contains other <i>random</i> html tags.';

$dom = new DOMDocument();
$dom->loadHTML($html_string);

foreach($dom->getElementsByTagName("a") as $each_node){
    $each_node->textContent = "##".$each_node->textContent."##";
}

echo $dom->saveHTML();

Обновить:

  • Чтобы получить только элементы внутри тела, вы можете передать его как подмножество в документ, как указано в методе saveHTML .

  • Как обсуждалось в комментариях, во избежание htmlParseEntityRef: expecting ';' in Entityчего происходит, потому что DOMDocumentэто путает с &представлением сущности HTML и ожиданием ;завершения сущности, мы заменяем все &на, &amp;чтобы избежать путаницы и сохранить их в конце.

  • Обратите внимание, что мы не можем использовать htmlspecialchars()его, так как он больше не будет HTML-документом для разбора.

Код:

$html_string = '<a href="db_test_or_live.website.com/df.php?p=##pending_code&a=##amount&c=##currency">##db_test_or_live.website.com/df.php?p=##pending_code&a=##amount&c=##currency</a>';

$html_string = str_replace("&","&amp;",$html_string);

$dom = new DOMDocument();
$dom->loadHTML($html_string);

foreach($dom->getElementsByTagName("a") as $each_node){
    $each_node->textContent = "##".$each_node->textContent."##";
}

$html_modified = $dom->saveHTML($dom->getElementsByTagName("body")->item(0));
$html_modified = str_replace(["<body>","</body>"],["",""],$html_modified);
$html_modified = str_replace("&amp;","&",$html_modified);

echo $html_modified;
Автор: vivek_23 Размещён: 28.03.2019 04:48

1 плюс

Попробуйте это решение, используя preg_replace:

$data =  '
         This is random <b>html code</b> which at some point can contain <a 
         href="page.php">a link</a> or even <a href="page2.php" 
         class="link">multiple links</a>.
         <br>But it also contains other <i>random</i> html tags.';
    $pattern ="/(>)([a-z ]*)(<\/a>)/i";
    $replacement = '${1}##${2}##${3}';
    echo preg_replace($pattern, $replacement, $data);

Regex попытается найти любую ссылку на шаблон и префикс ее с ## и постфикс с ##.

выход:

This is random <b>html code</b> which at some point can contain <a href="page.php">##a link##</a> or even <a href="page2.php" class="link">##multiple links##</a>.
<br>
But it also contains other <i>random</i> html tags.

Надеюсь, что это поможет вам

Автор: Mohammed Yassine CHABLI Размещён: 28.03.2019 04:50

0 плюса

Вы можете заменить строку, используя:

str_replace(">", ">####", $part)
str_replace("</a>", "####</a>", $part)

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

Автор: Tal Ben Arie Размещён: 28.03.2019 04:32
Вопросы из категории :
32x32