用于列表项和换行的PHP Regex


A PHP Regex for list Items and line breaks

我需要一个Regex来搜索"item one"并获得《美国精英》。或者"标题"并获得一句带有换行符的句子!"

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

因此Regex必须找到-之后的所有内容,一些特定的单词和一个:。这个字符串在换行之前结束,并带有下面的-

我试过这个

/[^-'s'item one']:*(.*)/g

低于https://regex101.com/.

您可以尝试以下模式:

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

演示

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

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

您可以使用以下搜索功能:

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!

代码演示

以下内容应该有效:

^-'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>";
}

输出:

第一项|美国运通

标题|带的一句话

断线!

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

你离这里不远了。

与其与item one完全匹配,不如与单词或空格匹配,因此这将是['w's]*

类似^- ['w's]*: (.*)的东西应该会起作用,尽管你还没有提到这些信息是如何进来的。一行,你想搜索和替换吗?使用CCD_ 18?

查看此链接以查看其工作情况。

使用正向查找:

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

如果短语(上例中的item one)不是常量,则可以使用'K删除迄今为止匹配的所有内容,以实现可变长度的正向查找:

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

这里有一个轻微的变化,允许您在多行上进行匹配。不要忘记gm标志

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

在操作中查看