假设我有以下文本:
__This_is__ a __test__
使用两个下划线表示斜体。所以我希望 This_is
和 test
为斜体。逻辑规定两个连续双下划线之间的任何文本都应为斜体,包括可能存在的任何其他数量的下划线。我有:
__([^_]+)__
第 1 组中“不是两个连续的下划线”相当于什么?谢谢。
最佳答案
一个选项是匹配两个下划线:
__
然后进行负向查找,看看当前位置前面是否没有两个下划线:
__(?!__)
如果不是这种情况,则匹配任意字符:
__(?!__).
并重复前一次或多次:
__((?!__).)+
最后匹配另外两个下划线:
__((?!__).)+__
这是最终的解决方案。
一个小演示:
<?php
$text = '__This_is__ a __test__';
preg_match_all('/__(?:(?!__).)+__/', $text, $matches);
print_r($matches);
?>
产生:
Array
(
[0] => Array
(
[0] => __This_is__
[1] => __test__
)
)
如Ideone所示.
编辑
请注意,我在演示中使用了非捕获组,否则输出将如下所示:
Array
(
[0] => Array
(
[0] => __This_is__
[1] => __test__
)
[1] => Array
(
[0] => s
[1] => t
)
)
即((?!__).)
匹配的最后一个字符将在组 1 中捕获。
有关组的更多信息,请参阅:http://www.regular-expressions.info/brackets.html
关于php - 用于解析斜体文本的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4874748/