如何在PHP中使用正则表达式在管道之间提取单词?
我正在编写一个解析器,需要使用php提取双管道之间的单词 例如,我想从下面的字符串中提取“ipsum”如何在PHP中使用正则表达式在管道之间提取单词?,php,regex,Php,Regex,我正在编写一个解析器,需要使用php提取双管道之间的单词 例如,我想从下面的字符串中提取“ipsum” Lorem ||ipsum|| blah 如果在双管道之间有多个单词,那么也应该提取它们 澄清 当我说多个词时,我不是这个意思:| |另一个词|| 我是说这个 ||Word1|| blah blah (newline) blah ||Word2|| 澄清第2部分 the ||quick|| brown fox ||jumps|| over the lazy ||dog|| 应该提取的单
Lorem ||ipsum|| blah
如果在双管道之间有多个单词,那么也应该提取它们
澄清
当我说多个词时,我不是这个意思:| |另一个词||
我是说这个
||Word1|| blah blah (newline)
blah ||Word2||
澄清第2部分
the ||quick|| brown fox ||jumps|| over the lazy ||dog||
应该提取的单词应该是“快速”、“跳跃”和“狗”
很抱歉给你带来困惑。。。下面可能有一些正确的答案,等我明天在工作中确认后,我会挑一个:)简单的回答怎么样
$array = explode('||', $string);
之后,可能需要使用trim()修剪数组值
另请参见和这里有一个正则表达式解决方案: 不过,这不允许管道成为世界的一部分。如果这是一项要求,则必须重新生成正则表达式。尝试以下操作:
if(preg_match('/\|\|(.*)\|\|/', $str, $matches) === 1){
echo $matches[1];
}
或者,如果有多个|
,请尝试以下操作:
if(preg_match_all('/\|\|(.*?)\|\|/', $str, $matches) !== FALSE){
print_r($matches[1]);
}
我想我知道你在找什么:
\|\|[a-zA-Z0-9]+\|\|
这应该满足您的示例:
||Word1|| blah blah (newline)
blah ||Word2||
挑选单词1和单词2的方法
您需要将两边的|
剥掉
有一种方法可以使用正则表达式将|
也去掉,但是要亲吻。阅读起来更容易,一般来说,以后把这些东西去掉也更容易。所以你有一个简单的正则表达式和一个简单的修剪
希望有帮助,正则表达式是否能比| |上的普通拆分更有效地完成此问题?文本不是管道分隔的,它是一个多行文件,可能包含多个双管道之间的特殊单词。分解它可能会起作用,但如果有一个单行解决方案,而不是在文件中循环,以确保单词不在不同行的管道之间,我宁愿它被您实际查找的内容弄糊涂了:S,示例没有帮助
\Q
是“引号”的开始,\E
(可选)结束先前开始的报价块。正如您在regex101.com上的解释中所看到的那样,\Q\E
中的字符按字面意思处理。它不太常见,但我在必须转义几个字符时使用它。增加可读性很多。这和我的表达式之间的区别是,这将允许|
在| | |
结构内部,但它也会弄乱像这样的字符串:它将|失败| | |正确| | | |这里|。相信我
。看:@Lindrian:那取决于OP想要什么。我的正则表达式将在这里提取fail | | | right |
。正确。我以为他不想那样,但谁知道呢。现在他有两种解决方案可供选择:)!很抱歉给你带来困惑。。。睡眠不足就会这样:/我想要的是字符串“it will | | | fail | | | | right | | | here | |”。相信我,把“失败”和“这里”这两个字摘录出来,谢谢!明天我确认后,我将接受您的答案,因为我现在无法计算:)请注意,结果数组中只有奇数索引应计为“管道之间”。
||Word1|| blah blah (newline)
blah ||Word2||