PHP会检测html中包含字符串的链接文本,并在其中包含一些字符

时间:2019-03-28 16:25:59

标签: php function replace hyperlink

在包含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代码,该代码有时可能包含a link甚至是multiple links

但是它还包含其他随机 html标签。

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

但是我需要看起来像这样:

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

这是随机的 html代码,该代码有时可能包含##a link##甚至是##multiple links##

但是它还包含其他随机 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>

但是当然也欢迎其他所有工作方法。

3 个答案:

答案 0 :(得分: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 EntityDOMDocument混淆以表示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;

答案 1 :(得分: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.

希望这对您有帮助

答案 2 :(得分:0)

您可以使用以下命令替换字符串:

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

但是要检测其中包含链接的代码部分,您可以拆分代码,然后在更改代码部分后将其重新加入