我需要一个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)*?(?=^-|$)
在操作中查看