用于列表项和换行符的PHP正则表达式

时间:2016-01-04 20:37:35

标签: php regex

我需要一个正则表达式来搜索"第一项" 并获得" Amet Elit" 。或者"标题" 并获取"一句话用\ na换行!"

- item one: Amet Elit
- Title: One sentence with 
a line break!
- Desc: Hello and thank you for your help!

因此,正则表达式必须在-,一些特定单词和:之后找到所有内容。并且此字符串在换行符之前结束,后面跟着-

我试过这个

/[^-\s'item one']:*(.*)/g
<{3>}下的

5 个答案:

答案 0 :(得分:1)

您可以尝试使用此模式:

/^- ([^:]*): (.*(?>\R.*)*?(?=\R- |\R*\z))/m

demo

在组1和组2中捕获。组2包含要匹配的非贪婪量词,直到前瞻中的条件成功为止。前瞻(?=...)检查第二组后面是换行符(\R)还是字符串末尾(\z

要获取特定项目,请将([^:]*)替换为您想要的任何内容。

答案 1 :(得分:1)

您可以使用此搜索功能:

function srch($input, $key) {
    preg_match('/(?<=\b' . preg_quote($key, '/') . ': ).*?(?=\n-|$)/s', $input, $m);
    return $m[0];
}

然后将其称为:

$input = "- item one: Amet Elit
- Title: One sentence with
a line break!
- Desc: Hello and thank you for your help!";

php> echo srch($input, 'Title')
One sentence with
a line break!

php> echo srch($input, 'item one')
Amet Elit

php> echo srch($input, 'Desc')
Hello and thank you for your help!

Code Demo

答案 2 :(得分:1)

以下内容应该有效:

^-\h*([^:\R]*)\h*:\h*(.*$(?:\R[^-].*$)*)

Fiddle

部分分解:

  • ^-\h*([^:\R]*)\h*:匹配起始连字符(必须出现在行开头)到冒号之间的单词,修剪(\h*是捕获之外的水平空白)。该部分(\R

  • 中不能有换行符
  • \h*(.*):匹配该行的其余部分(左侧修剪)。

  • (?:\R[^-].*$)*:非捕获((?:)组允许跟随零行或多行,条件是它们不以连字符(\R[^-])开头。

在PHP中:

$input = "- item one: Amet Elit
- Title: One sentence with 
a line break!
- Desc: Hello and thank you for your help!";

preg_match_all("#^-\s*([^:\R]*)\s*:\s*(.*(?:\R[^-].*$)*)#m",
               $input, $matches);

foreach ($matches[1] as $i => $prefix) {
    echo $prefix . " | " . $matches[2][$i] . "<br>";
}

输出:

  

第一项| Amet Elit

     

标题|一句话

     

换行!

     

描述|您好,谢谢您的帮助!

答案 3 :(得分:0)

使用积极的lookbehind:

(?<=^- item one: ).*$

如果短语(上例中的item one)不是常数,您可以使用\K删除目前为止匹配的所有内容,以获得具有可变长度的正向观察:

^- [^:]*: \K.*$

这是一个轻微的替换,允许您匹配多行。别忘了gm旗帜

^- [^:]*: \K(.|\n)*?(?=^-|$)

See it in action

答案 4 :(得分:0)

你离我不远。

而不是与item one完全匹配,而是希望与单词或空格匹配,以便[\w\s]*

^- [\w\s]*: (.*)的某些内容应该有效,但您还没有提到这些信息的来源。一行,您是否正在尝试搜索和替换?使用preg_match

Check this link out to see it working.