我有一个短代码,应该使用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] =>
)
)
答案 0 :(得分:1)
我必须通过html_entity_decode函数运行$ content。这会将内容恢复为原始格式,并且preg_match按预期工作。