假设我有以下文字:
__This_is__ a __test__
使用两个下划线表示斜体。所以我希望This_is
和test
是斜体。逻辑规定两个连续双下划线之间的任何文本都应该是斜体,包括可能存在的任何其他数量的下划线。我有:
__([^_]+)__
第1组中“不是两个连续下划线”相当于什么?感谢。
答案 0 :(得分:3)
一个选项是匹配两个下划线:
__
然后向前看,看看在当前位置之前是否没有两个下划线:
__(?!__)
如果不是这种情况,请匹配任何字符:
__(?!__).
并重复前一次或多次:
__((?!__).)+
并最终匹配另外两个下划线:
__((?!__).)+__
这是最终解决方案。
一个小小的演示:
<?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
答案 1 :(得分:1)
$text = '__This_is__ a __test__';
preg_match_all('/(__([\w]+)__)/', $text, $matches);
print_r($matches);