我正在尝试解析文件并查找特定匹配项,以某种方式对其进行过滤,然后将该数据打印回文件中并删除一些字符。我已经尝试了几个小时不同的东西,包括preg slits和preg replace,但我的常规表达知识有限,所以我没有取得多大进展。
我有一个大文件,有很多像这样的东西[title] {title:value}。我想找到“[”和“}”之间的所有内容,并删除“某事”位之外的所有内容。
完成部分之后,我想在{title:value}之类的所有内容中找到“{”和“}”之间的所有内容,然后删除“值”部分之外的所有内容。我确信有一些简单的方法可以做到这一点,所以即使只是一个如何开始的资源也会有所帮助。
答案 0 :(得分:1)
不确定我的意思是否正确(并且几个月没有触及PHP),这个怎么样?
$matches = array();
preg_match_all("/\[(.*?)\]\{.*?:(.*?)\}/", $str, $matches);
$something = $matches[1]; // $something stores all texts in the "something" part
$value = $matches[2]; // $value stores all texts in the "value" part
对于正则表达式模式\[(.*?)\]\{.*?:(.*?)\}
:
[
,]
,{
和}
因为这些字符在正则表达式中具有特殊含义,并且需要为文字转义字符。.*?
是一个懒惰的匹配all,它将匹配任何字符,直到下一个字符与下一个标记匹配。它用于代替.*
,因此它与其他符号(.*?)
是一个捕获组,获得我们需要的东西,PHP会将这些匹配放在$matches
数组[
字符,然后匹配任何字符串,直到获得]
字符并将其放入捕获组1,然后是]{
个字符,然后是任何字符串,直到获取:
字符(没有捕获组,因为我们不关心。),然后匹配:
字符,然后匹配任何字符串,直到}
字符并将其置于组2中。 / LI>
醇>
答案 1 :(得分:0)
你可以一次性完成:
$txt = preg_replace('~\[\K[^]]*(?=])|{[^:}]+:\K[^}]+(?=})~', '', $txt);
\K
从匹配结果中删除了他左边匹配的所有内容。
前瞻(?=...)
(后跟)执行检查但不对匹配结果添加任何内容。