gpt4 book ai didi

php - preg_replace 添加目标 ="_blank",但排除某些实例

转载 作者:行者123 更新时间:2023-12-04 15:42:26 25 4
gpt4 key购买 nike

我在组合正确的 RegEx 模式以将 target="_blank"添加到我的链接时遇到问题。将其添加到所有链接..没问题,但我需要根据模式排除某些实例。

这是我用来更新 href 中显示为 http://的目标的所有链接的 preg_replace()

preg_replace('/(<a href="http:[^"]+")>/is','\\1 target="_blank">',$content);

这是我想要得到的场景

link1 /somepage.htm (no target="_blank") Above works
link2 http://www.somesiteexternal.com/ (add target="_blank") Above works
link3 http://www.example.com/somepage.htm (no target="_blank") this is where I'm having a problem.

我想排除http://www.example.comhttp://example.com (这将是代码所在的域)来自目标处理,但如果链接是绝对链接或指向另一个未使用 domain.com 的外部站点,那么我想要那个。

尝试在此 (<a href="http:[^"]+") 中添加排除/异常(exception)模式给我带来麻烦。

谢谢!韩纸

最佳答案

这里是使用 DOM 操作来获取你想要的东西的方法。

$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);

$linkNodeList = $xpath->query('//a[starts-with(@href, "http://")]');

$targetAttr = $dom->createAttribute('target');

foreach($linkNodeList as $linkNode) {
if (!$linkNode->hasAttribute('target'))
$linkNode->appendChild($targetAttr);
$linkNode->setAttribute('target', '_blank');
}

$html = $dom->saveHTML();

注意:由于某些原因,LIBXML_... 常量有时未定义,因此您可以通过在之前添加以下内容来解决问题:

if (!defined('LIBXML_HTML_NOIMPLIED'))
define('LIBXML_HTML_NOIMPLIED', 8192);
if (!defined('LIBXML_HTML_NODEFDTD'))
define ('LIBXML_HTML_NODEFDTD', 4);

如果要排除特定域,可以使用 parse_url 并在 foreach 循环中添加条件(这是最简单的方法):

$forbidden_host = 'example.com';

foreach($linkNodeList as $linkNode) {
$host = parse_url($linkNode->getAttribute('href'), PHP_URL_HOST);
$host = preg_replace('~\Awww\.~', '', strtolower($host));
if ($host === $forbidden_host)
continue;

if (!$linkNode->hasAttribute('target'))
$linkNode->appendChild($targetAttr);

$linkNode->setAttribute('target', '_blank');

}

或者您可以在 xpath 查询中插入一个条件:

$query = '//a[starts-with(@href, "http://") and not(starts-with(@href, "http://www.example.com") or starts-with(@href, "http://example.com"))]';

关于php - preg_replace 添加目标 ="_blank",但排除某些实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28202060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com