停止在空格上分割正则表达式

时间:2015-03-31 01:09:55

标签: php regex parsing preg-match-all

我正在编写一个解析器,尝试自动化一种方法,我可以将任何参数作为参数传递如下:

$content = '{loop for=products showPagination="true" paginationPosition="both" wrapLoop="true" returnDefaultNoResults="true" noResultsHeading="Nothing Found" noResultsHeadingSize="2" noResultsParagraph="We have not found any products in this category, please try another."}{/loop}';
preg_match_all('/([a-zA-Z]+)=([\/\.\"a-zA-Z0-9&;,_-]+)/', str_replace('"', '"', $content), $attr);

if (!is_array($attr)) return array();

for ($z = 0; $z < count($attr[1]); $z++) if (isset($attr['1'][$z])) $attrs[$attr['1'][$z]] = trim($attr['2'][$z], '"');

echo json_encode($attrs);

我的问题是我的循环&amp;正则表达式正在拆分空白,我无法弄清楚如何改变它,以便它不会。

我尝试将\ w添加到=符号的右侧,但没有运气。

RESULT

{"for":"products","showPagination":"true","paginationPosition":"both","wrapLoop":"true","returnDefaultNoResults":"true","noResultsHeading":"Nothing","noResultsHeadingSize":"2","noResultsParagraph":"We"}

你会注意到最后两个参数都在第一个单词后停止。

1 个答案:

答案 0 :(得分:1)

我建议您更改preg_match_all功能,如下所示。

preg_match_all('/([a-zA-Z]+)=("[^"]*"|\S+)/', str_replace('&quot;', '"', $content), $attr);

首先会贪婪地匹配所有双引号内容。如果没有任何双引号块,则它将匹配一个或多个非空格字符。

<强>输出:

{"for":"products","showPagination":"true","paginationPosition":"both","wrapLoop":"true","returnDefaultNoResults":"true","noResultsHeading":"Nothing Found","noResultsHeadingSize":"2","noResultsParagraph":"We have not found any products in this category, please try another."}