我需要一个正则表达式来搜索"第一项" 并获得" 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>}下的。
答案 0 :(得分:1)
您可以尝试使用此模式:
/^- ([^:]*): (.*(?>\R.*)*?(?=\R- |\R*\z))/m
键和值在组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!
答案 2 :(得分:1)
以下内容应该有效:
^-\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
标题|一句话
换行!
描述|您好,谢谢您的帮助!
答案 3 :(得分:0)
使用积极的lookbehind:
(?<=^- item one: ).*$
如果短语(上例中的item one
)不是常数,您可以使用\K
删除目前为止匹配的所有内容,以获得具有可变长度的正向观察:
^- [^:]*: \K.*$
这是一个轻微的替换,允许您匹配多行。别忘了gm
旗帜
^- [^:]*: \K(.|\n)*?(?=^-|$)
答案 4 :(得分:0)
你离我不远。
而不是与item one
完全匹配,而是希望与单词或空格匹配,以便[\w\s]*
^- [\w\s]*: (.*)
的某些内容应该有效,但您还没有提到这些信息的来源。一行,您是否正在尝试搜索和替换?使用preg_match
?