【问题标题】:PHP preg_replace() to change copyright yearPHP preg_replace() 更改版权年份
【发布时间】:2016-03-23 23:36:48
【问题描述】:

我的 xml 中多次出现以下文本:

版权所有 © 2015。

我正在尝试使用正则表达式动态更改上述文本,以便始终在最终输出中反映当前年份。这是我的尝试,它似乎不起作用:

$finaloutput = preg_replace("/Copyright © [0-9]+/", "test", $finaloutput);

当然,我使用硬编码字符串(“test”)只是出于测试目的,因为当前文本中已经包含 2015。所以,我的目标是改变这一点:

版权所有 © 2015。保留所有权利....

进入这个:

版权 © 测试。保留所有权利....

我的正则表达式错了吗?

P.S.:只是为了让大家更好地了解上下文,这里(部分)XML sn-p $finaloutput 分配给:

<div class="dict_source"><strong>Powered by</strong> <a target="_blank" rel="nofollow" href="http://www.collinsdictionary.com/dictionary/english-spanish">Collins Complete Spanish Electronic Dictionary</a><br>Copyright © 2015 HarperCollins Publishers Limited.</div>

更新:我尝试了@Avinash 提供的答案,但仍然未能成功。为了更好地说明这个问题,我挖出了一个在线的preg_replace()测试器。结束于https://www.functions-online.com/preg_replace.html。以下是我在各个输入字段中输入的信息以供测试:

$pattern'/(Copyright\s+©\s+)[0-9]+/u'

$replacement'\1test'

$subject&lt;div class="dict_source"&gt;&lt;strong&gt;Powered by&lt;/strong&gt; &lt;a target="_blank" rel="nofollow" href="http://www.collinsdictionary.com/dictionary/english-spanish"&gt;Collins Complete Spanish Electronic Dictionary&lt;/a&gt;&lt;br&gt;Copyright © 2015 HarperCollins Publishers Limited.&lt;/div&gt;

【问题讨论】:

  • ©还是实体?空格也正确吗?试试var_dump($finaloutput);

标签: php regex preg-replace


【解决方案1】:

在 PHP 中使用 Avinashs 正则表达式:

<?php
$subject    = '<div class="dict_source"><strong>Powered by</strong> <a target="_blank" rel="nofollow" href="http://www.collinsdictionary.com/dictionary/english-spanish">Collins Complete Spanish Electronic Dictionary</a><br>Copyright © 2015 HarperCollins Publishers Limited.</div>';
$regex      = '/(Copyright\s+©\s+)[0-9]+/u';
$output = preg_replace($regex, "\${1}2016", $subject);
echo $output; // Happy new Year 2016!
?>

注意替换部分:\12016(正如人们通常认为的那样)会混淆引擎(应使用哪个捕获的组?\1\12016?[虽然这不存在]),所以解决方案是使用 curly 括号。

【讨论】:

    【解决方案2】:

    在处理 unicode 字符时添加 u 修饰符。

    $finaloutput = preg_replace('/(Copyright\s+©\s+)[0-9]+/u', '\1test', $finaloutput);
    

    【讨论】:

    • 你给出的语法对我来说看起来很完美,也很简单,但它却因为一些被上帝遗忘的原因而拒绝工作。我将进一步调查,看看问题可能出在哪里。它当然似乎与您的语法不符。 “\1”是干什么用的?只是好奇。
    • \1 指的是第一组匹配的所有字符。
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2012-10-12
    • 2011-07-09
    • 2021-08-13
    • 2013-11-15
    相关资源
    最近更新 更多