我有多个包含在字符串中的相对链接。但是,我也希望将所有链接替换为简单的javascript:alert("Sorry You Cannot Do That.")
,并且我不希望任何绝对路径(例如http://google.com
)仅更改/conf/bin.html
等相对路径。
以下是一个示例代码段:
$pattern = "/<a(.*) href='\/(.*)'(.*)>reply</a>/";
$string = "<a target='_blank' href='/conf/bin?post=5760627b29ba0' name='bin' id='bin' class='bin' title='Hide From Feed'></a>
wow
<a target='_blank' href='/conf/bin?post=5760627b29ba0' name='bin' id='bin' class='bin' title='Hide From Feed'></a> wow";
while (preg_match($pattern, $string)){
$string = preg_replace($pattern, "<tr><td align='right'><a href='javascript:alert(" . chr(34) . "Sorry You Cannot Do That" . chr(34) . ")' style='text-decoration:none;'>reply</a>", $string);
}
我希望字符串最终成为:
$string = "<a target='_blank' href='javascript:alert(" . chr(34) . "Sorry You Cannot Do That" . chr(34) . ")' name='bin' id='bin' class='bin' title='Hide From Feed'></a>
wow
<a target='_blank' href='javascript:alert(" . chr(34) . "Sorry You Cannot Do That" . chr(34) . ")' name='bin' id='bin' class='bin' title='Hide From Feed'></a> wow";
任何人都可以提供帮助。 感谢
答案 0 :(得分:1)
您可以使用domdocument
来解析HTML,然后使用正则表达式来验证网址。
$string = "<a target='_blank' href='/conf/bin?post=5760627b29ba0' name='bin' id='bin' class='bin' title='Hide From Feed'></a>
wow
<a target='_blank' href='/conf/bin?post=5760627b29ba0' name='bin' id='bin' class='bin' title='Hide From Feed'></a> wow
<a target='_blank' href='http://www.google.com/conf/bin?post=5760627b29ba0' name='bin' id='bin' class='bin' title='Hide From Feed'></a>";
$string .= '<script type="text/javascript">function send_alert(){ alert("Sorry You Cannot Do That.");}</script>';
$doc = new DOMDocument();
$doc->loadHTML($string);
foreach($doc->getElementsByTagName('a') as $link) {
if(preg_match('~^(?!https?://)~', $link->getAttribute('href'))) {
$link->setAttribute('href', 'javascript:send_alert();');
}
}
echo $doc->saveHTML();
PHP演示:https://eval.in/595820
正则表达式演示:https://regex101.com/r/mP2gC8/1
或另类引用版本:
$string = "<a target='_blank' href='/conf/bin?post=5760627b29ba0' name='bin' id='bin' class='bin' title='Hide From Feed'></a>
wow
<a target='_blank' href='/conf/bin?post=5760627b29ba0' name='bin' id='bin' class='bin' title='Hide From Feed'></a> wow
<a target='_blank' href='http://www.google.com/conf/bin?post=5760627b29ba0' name='bin' id='bin' class='bin' title='Hide From Feed'></a>";
$doc = new DOMDocument();
$doc->loadHTML($string);
foreach($doc->getElementsByTagName('a') as $link) {
if(preg_match('~^(?!https?://)~', $link->getAttribute('href'))) {
$link->setAttribute('href', 'javascript:alert(decodeURIComponent(\'Sorry You Cannot Do That.\'));');
}
}
echo $doc->saveHTML();
答案 1 :(得分:1)
您可以将DOMDocument与XPath结合使用,并使用XPath查询获取所有此类标记:
//a[starts-with(@href, '/') and text()='reply']
正如您在问题中对a
的测试 - 标记:
href
值不是“绝对”路径(例如,不是http://google.com
,而是abc/def/ghi.php
或/abc/x.php
),reply
。对于第一次测试,您可以测试是否缺少冒号(:
)。
请注意,如果您使用javascript替换href
值,则还应删除target
属性,因为这会不必要地打开新的浏览器窗口。
以下是代码:
$doc = new DOMDocument();
$doc->loadHTML($string);
$xpath = new DOMXpath($doc);
foreach($xpath->query("//a[not(contains(@href, ':')) and text()='reply']") as $link) {
$link->setAttribute('href', 'javascript:alert("Sorry You Cannot Do That");');
// remove any target attribute
$link->removeAttribute('target');
}
// remove the stuff that DOMDocument has added:
echo preg_replace("/^.*\<BODY>(.*)<\/BODY><\/HTML>$/is", "$1", $doc->saveHTML());
上查看它
请注意您如何使用and
,or
,not()
,contains()
等建立XPath查询。
答案 2 :(得分:0)
您可以使用例如http://simplehtmldom.sourceforge.net/ 使用此库,您可以找到所有'a'标签:
$html = new simple_html_dom();
$html->load_file($string);
$link = $html->find('a');
当您找到所有'a'元素时,您可以替换它的某些部分 选中“如何修改HTML元素”选项卡,例如
$link = $html->find('a')->href = 'new value of href'