【问题标题】:php insert text into a hrefphp将文本插入href
【发布时间】:2011-06-20 13:24:26
【问题描述】:

我正在使用 htmlpurifier 创建我的网站的纯文本版本。 我现在需要用纯文本 url 替换所有 a href,即“www.example.com/aboutus”变为“www.example.com/text/aboutus”

最初我在域上尝试了一个简单的 str_replace(我为域使用了一个全局变量),但问题是文件的链接也被替换了,即 'www.example.com/document.pdf' 变为 'www.example.com/text/document.pdf' 并因此失败。

是否有一个正则表达式,我可以说用不包含字符串的域/文本替换域?

感谢您能给我的任何指点:)

【问题讨论】:

  • 考虑到 Javascript 的 DOM 选择器不涉及通过正则表达式检查整个页面,这可能会更容易使用 Javascript。
  • @MoarCodePlz:PHP 也是如此!你在说什么?
  • 一行通过 jquery ($('a').each(function() { if ($(this).attr('href') == SOMEQUALITY) $(this).attr ('href', newValue); }); 会比我所知道的任何 php 实现都简单得多。不过我可能会遗漏一些东西。
  • 谢谢大家。如果可能的话,我想坚持使用 PHP,因为它是纯文本版本,所有样式和 js 都被删除了。另外为了让一切动态工作,生成的 html 无论如何都会放入 PHP 变量中,所以我想我只需要对字符串做一个正则表达式......但这就是我的技能用完的地方lol

标签: php regex .htaccess


【解决方案1】:

使用negative lookahead

$output = preg_replace(
             '#www.example.com(?!/text/)#', 
             'www.example.com/text', 
             $input
          );

更好的是,使用DOM

$html = '<a href="www.example.com/something">foo</a>
         <p>hello</p>
         <a href="www.example.com/text/documents">bar</a>';

libxml_use_internal_errors(true); // supresses DOM errors

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

$hrefs = $xpath->query('//a/@href');
foreach ($hrefs as $href) {
    $href->value = preg_replace(
                      '#^www.example.com(?!/text/)(.*?)(?<!\.pdf)$#', 
                      'www.example.com/text\\1', 
                      $href->value
                   );
}

这应该给你:

<a href="www.example.com/text/something">foo</a>
<p>hello</p>
<a href="www.example.com/text/documents">bar</a>

【讨论】:

  • 感谢 netcoder - 刚去开会,但这听起来很有趣!我会尽快回来报告。
  • 我回来了!我在使用 DOM 时遇到了问题,因为我在某些元素上使用了名称和 id,所以我得到“ID 已在实体中定义”错误。我一直在努力让 php 负面环视示例也能正常工作。如果我用 $input = "example.com/aboutus<br />example.com/testing123<br />example.com/info/test<br />example.com/document.pdf"; 运行它,我只会得到 'aboutus' 变成 'text/aboutus'。其他的都和以前一样。
  • @user287212:对于 DOM,使用 libxml_use_internal_errors 来抑制错误。我修复了模式(在两个示例中添加了尾随 /,并在第一个示例的开头删除了 ^)。查看更新的答案。
  • 你好网络编码器。我早上回到办公室时会检查一下,但是非常感谢您今天的帮助:)
  • 你好网络编码器。很抱歉延迟回复您。我已经尝试过了,但 PDF 的链接也被重写为包含“/text”。我做错了吗?
猜你喜欢
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 2013-05-05
  • 2014-07-01
  • 2017-02-05
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
相关资源
最近更新 更多