在包含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>
但是当然也欢迎其他所有工作方法。
答案 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 Entity
与DOMDocument
混淆以表示HTML实体并期望&
完成而发生;
实体,我们将所有&
替换为&
,以避免造成混淆,并保留到最后。
请注意,我们不能使用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("&","&",$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("&","&",$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)
但是要检测其中包含链接的代码部分,您可以拆分代码,然后在更改代码部分后将其重新加入