[英]A PHP Regex for list Items and line breaks
我需要一个正则表达式来搜索“第一项”并获得“Amet Elit” 。 或者“标题”并得到“一句话用\\ na linebreak!”
- item one: Amet Elit
- Title: One sentence with
a line break!
- Desc: Hello and thank you for your help!
因此,正则表达式必须找到所有内容-
,一些特定的单词和:
。 并且这个字符串在换行符之前结束-
我试过这个
/[^-\s'item one']:*(.*)/g
您可以尝试使用此模式:
/^- ([^:]*): (.*(?>\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[^-].*$)*)
小提琴 。
部分分解:
^-\\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
标题| 一句话
换行!
描述| 您好,感谢您的帮助!
使用积极的lookbehind:
(?<=^- item one: ).*$
如果短语( item one
在上面的例子中)不是恒定的,你可以使用\\K
放下一切,到目前为止匹配,实现与可变长度积极的回顾后:
^- [^:]*: \K.*$
这是一个轻微的替换,允许您匹配多行。 不要忘记gm
标志
^- [^:]*: \K(.|\n)*?(?=^-|$)
你离我不远。
而不是与要与字或空格匹配的第一item one
完全匹配,所以这将是[\\w\\s]*
^- [\\w\\s]*: (.*)
应该有效,尽管你还没有提到这些信息是如何进入的。有一行,你试图搜索和替换吗? 使用preg_match
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.