短代码内容不等于作为字符串值传递的相同文本。 preg_match_all返回不同的结果

时间:2014-04-22 23:12:28

标签: php regex wordpress preg-match-all shortcode

我有一个短代码,应该使用preg_match_all解析内容,格式如下:

Sex:3,Drugs,4,Violence:1,Rock & Roll,5

标签和编号等级。

当我将上述内容作为字符串变量提供给它时​​,以下模式有效:

%([\w&\s]+)[:,\|\/]{1}(\d+)([\|,\|\/]{0,1})%

模式足够智能,允许值之间有多个分隔符。用一个单词,它一直有效。但是,当我在短代码函数中输入与$ content值完全相同的字符串时,最后一个标签是' Rock&罗尔'作为' Roll'返回。

为了清楚起见,我将与字符串变量 $ contentX 完全相同的值输入preg_match_all并返回' Rock& 。辊'

当我将$ content变量与我的$ contentX变量进行比较时,使用

if ($content === $contentX) {

}

PHP告诉我两个字符串完全相同,即使$ contentX是通过短代码提供的文本的精确副本。

不知何故,通过短代码$ content变量以改变正则表达式行为的方式更改字符串。我可以对$ content变量做些什么来使它的行为与直接传递给preg_match_all的字符串值相同?

这是与两个人比较的代码。

function WTF($atts, $content) {

    $pattern = '%([\w&\s]+)[:,\|\/]{1}(\d+)([\|,\|\/]{0,1})%';

    $conX = 'Sex:3,Drugs,4,Violence:1,Rock & Roll,5';

    preg_match_all($pattern, $content, $xmatch, PREG_SET_ORDER);
    preg_match_all($pattern, $conX, $ymatch, PREG_SET_ORDER);

    $ret = '<pre>' . print_r($xmatch, TRUE);

    $ret .= "\n" . print_r($ymatch, TRUE);

    if ($content === $conX) {
        $ret .= "\n" . 'Match!';
    } else {
        $ret .= "\nNo Match!";
    }
    $ret .= '</pre>';

    return $ret;

}

第一遍的print_f($ content)返回:

Array
(
  [3] => Array
    (
        [0] =>  Roll,5
        [1] =>  Roll
        [2] => 5
        [3] => 
    )

)

以下是$ conX的print_r()输出:

Array
(
  [3] => Array
    (
        [0] => Rock & Roll,5
        [1] => Rock & Roll
        [2] => 5
        [3] => 
    )

 )

1 个答案:

答案 0 :(得分:1)

我必须通过html_entity_decode函数运行$ content。这会将内容恢复为原始格式,并且preg_match按预期工作。