我有一个简短的代码,应该使用preg_match_all解析格式如下的内容:
Sex:3,Drugs,4,Violence:1,Rock & Roll,5
分为标签和数字评级。
当我将以上内容作为字符串变量输入时,以下模式有效:
%([w&s]+)[:,|/]{1}(d+)([|,|/]{0,1})%
该模式足够智能,可以在值之间使用多个分隔符。只要一个单词,它就一直有效。然而,当我在一个shortcode函数中输入与$content值完全相同的字符串时,最后一个标签"Rock&Roll,'返回为"Roll"。
为了清楚起见,我将与字符串变量$contentX完全相同的值输入到preg_match_all中,它返回"Rock&滚。"
此外,当我使用将$content变量与我的$contentX变量进行比较时
if ($content === $contentX) {
}
PHP告诉我,这两个字符串是而不是完全相等的,尽管$contentX是通过短代码提供的文本的精确副本。
不知怎的,通过shortcode$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] =>
)
)
我必须通过html_entity_decode函数运行$content。这将使内容返回到其原始形式,并且preg_match按预期工作。