用于解析斜体文本的正则表达式?

时间:2011-02-02 13:00:18

标签: php regex parsing italic

假设我有以下文字:

__This_is__ a __test__

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

__([^_]+)__

第1组中“不是两个连续下划线”相当于什么?感谢。

2 个答案:

答案 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);

http://ideone.com/uHJCC