假设我有以下文本:
__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
$text = '__This_is__ a __test__';
preg_match_all('/(__([\w]+)__)/', $text, $matches);
print_r($matches);