找到匹配,删除我不想要的位,然后将其重新放入

时间:2014-02-26 12:55:57

标签: php regex replace preg-replace preg-match

我正在尝试解析文件并查找特定匹配项,以某种方式对其进行过滤,然后将该数据打印回文件中并删除一些字符。我已经尝试了几个小时不同的东西,包括preg slits和preg replace,但我的常规表达知识有限,所以我没有取得多大进展。

我有一个大文件,有很多像这样的东西[title] {title:value}。我想找到“[”和“}”之间的所有内容,并删除“某事”位之外的所有内容。

完成部分之后,我想在{title:value}之类的所有内容中找到“{”和“}”之间的所有内容,然后删除“值”部分之外的所有内容。我确信有一些简单的方法可以做到这一点,所以即使只是一个如何开始的资源也会有所帮助。

2 个答案:

答案 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

preg_match_all的文档

对于正则表达式模式\[(.*?)\]\{.*?:(.*?)\}

  1. 我们使用斜杠转义所有[]{}因为这些字符在正则表达式中具有特殊含义,并且需要为文字转义字符。
  2. .*?是一个懒惰的匹配all,它将匹配任何字符,直到下一个字符与下一个标记匹配。它用于代替.*,因此它与其他符号
  3. 不匹配
  4. (.*?)是一个捕获组,获得我们需要的东西,PHP会将这些匹配放在$matches数组
  5. 所以整个事情是 - 匹配[字符,然后匹配任何字符串,直到获得]字符并将其放入捕获组1,然后是]{个字符,然后是任何字符串,直到获取:字符(没有捕获组,因为我们不关心。),然后匹配:字符,然后匹配任何字符串,直到}字符并将其置于组2中。 / LI>

答案 1 :(得分:0)

你可以一次性完成:

$txt = preg_replace('~\[\K[^]]*(?=])|{[^:}]+:\K[^}]+(?=})~', '', $txt);

\K从匹配结果中删除了他左边匹配的所有内容。

前瞻(?=...) (后跟)执行检查但不对匹配结果添加任何内容。