2

假设我有以下文本:

__This_is__ a __test__

使用两个下划线表示斜体。所以我期望This_istest用斜体表示。逻辑规定,两个连续双下划线之间的任何文本都应为斜体,包括可能存在的任何其他数量的下划线。我有:

__([^_]+)__

第 1 组中“不是两个连续的下划线”的等价物是什么?谢谢。

4

2 回答 2

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

于 2011-02-02T13:21:37.737 回答
1
$text = '__This_is__ a __test__';
preg_match_all('/(__([\w]+)__)/', $text, $matches);
print_r($matches);

http://ideone.com/uHJCC

于 2011-02-02T13:30:19.657 回答