繁体   English   中英

如何使用PHP preg_match_all在自定义标记(而非html)中获取内容,

[英]How to use PHP preg_match_all, to obtain the contents inside a custom tag(not html),

我必须为多语言站点保存用户名和简历。 由于使用的语言数量会随着时间的推移而改变,因此我尝试从html文本区域以以下格式获取它们。

[lang:en]
Some content some content some content
some content some content
some content 
[endlang:en]

[lang:zh]
有些内容有些内容有些内容
一些内容有些内容
一些内容
[endlang:zh]

因此,提交表单时,我想获得根据语言分开的内容。 我正在使用preg_match_all:

$count = preg_match_all('|\[lang:([a-z]{2})\](.*)\[endlang:[a-z]{2}\]|si',$value,$matches);

但它什么也没捉住。 我该怎么做才能解决这个问题?

您的正则表达式目前很贪婪; . )尽可能匹配,因此它将匹配[lang:xx]标签和[endlang:xx]标签之间的所有内容。 为了解决此问题,您可以通过添加?来使模式变得懒惰? 最后,就像这样:

\[lang:([a-z]{2})\]\R*(.*?)\R*\[endlang:\1\]

请注意,我还在正则表达式中使用了\\R ,它将捕获字符串中的任何垂直空格字符-这样,换行符将不会包含在匹配结果中。

此外,开头标签中的语言代码可能与匹配的结束标签中使用的语言代码不同。 我在结束标记中使用了反向引用\\1 )来避免这种情况-它使匹配更加健壮。

完整的代码:

$pattern = '|\[lang:([a-z]{2})\]\R*(.*?)\R*\[endlang:\1\]|si';

preg_match_all($pattern, $value, $matches);

// Combine the languages and matched strings to create an associative array
$result = array_combine($matches[1], $matches[2]);

var_dump($result);

演示

默认情况下,PHP regex表现为贪婪。 因此,您的版本将与第一个开始标签和最后一个结束标签匹配。 您可以通过添加?来指定非贪婪行为。 到相应的部分是这样的:

$count = preg_match_all('|\[lang:([a-z]{2})\](.*?)\[endlang:[a-z]{2}\]|si',$value,$matches);

这将使表达式在标签之间选择尽可能少的行。 我刚刚测试过,它似乎可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM