【问题标题】:preg_replace_callback() returns wrong arrays when multiple instancespreg_replace_callback() 在多个实例时返回错误的数组
【发布时间】:2018-01-22 23:44:28
【问题描述】:

我有以下脚本将我的字符串中的[amazon region=com asin=1234567] 替换为getAffiliateLink("com","1234567") 以触发PHP 函数并显示特定的div:

$content = preg_replace_callback('/\[amazon region=([^\b]+) asin=([^\b]+)\]/', 'callback', $content);

 function callback ($matches) {
    print_r($matches);
    return getAffiliateLink("$matches[1]","$matches[2]");
 }

 echo $content;

现在这可以完美运行.. 直到我的字符串中有多个 [amazon region=com asin=1234567] 实例,每个实例都有不同的 asin 号。

然后我得到以下打印:

Array ( 
    [0] => [amazon region=com asin=B004QJ9458] [amazon region=com asin=B0080KWRI0] 
    [1] => com asin=B004QJ9458] [amazon region=com 
    [2] => B0080KWRI0 
)

看看上面的输出,很明显这里出了点问题。如何更改我的代码,使其适用于特定字符串的不同实例?

【问题讨论】:

  • 您的+ 操作员很贪心,使用+? 让他们不贪心。
  • @Sammitch 谢谢,这似乎返回了一个正确的数组。现在我的 PHP 函数为第一个实例执行,但返回下一个实例缺少参数的通知。仅在函数第一次正确触发时..
  • 别在意我的最后一个回复,它现在完美运行!非常感谢,我学到了新东西!
  • @SenneVandenputte 你检查过我下面的答案了吗?

标签: php preg-replace preg-replace-callback


【解决方案1】:

[^\b] 字符类匹配除 \x08 字符 (BACKSPACE) 以外的任何字符。

您可以使用修复模式

$content = preg_replace_callback('/\[amazon region=(\S+) asin=(\S+)\]/', 'callback', $content);

请参阅PHP demo

\S+ 匹配 1 个或多个非空白字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多