字符串php中的preg_match和preg_replace

时间:2013-08-13 11:39:07

标签: preg-replace preg-match preg-match-all

$string = "Lorem Ipsum is #simply# dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard #dummy# text ever since the 1500s, when an unknown printer took a galley of #type1# and scrambled it to #make# a #type2# specimen book. It has survived not only #five# centuries, but also the #leap# into electronic typesetting, remaining essentially unchanged";

我有一组硬代码字,例如"#simply# | #dummy# | #five# | #type1#"

我期望的输出是:

  1. 如果在$string中找到硬代码字,则应以黑色突出显示。比如"<strong>...</strong>"

  2. 如果$string中的单词在#...#范围内但在硬代码字列表中不可用,则字符串中的这些单词应以红色突出显示。

  3. 请注意,即使我们在硬编码字中有#type1#,如果$ string包含#type2##type3#,它也应该突出显示。

  4. 这样做我尝试了如下

    $pattern = "/#(\w+)#/";
    
    $replacement = '<strong>$1</strong>';
    
    $new_string = preg_replace($pattern, $replacement, $string);
    

    这让我得到#..#标签突出显示的所有单词。

    我在preg_不好有人可以提供帮助。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您必须使用带有回调函数的preg_replace_callback作为替换参数。在该函数中,您可以测试哪个捕获组已成功并根据。

返回字符串
$pattern = '~#(?:(simply|dummy|five|type[123])|(\w+))#~';
$replacement = function ($match) {
    if ( empty($match[2]) )
        return '<strong>' . $match[1] . '</strong>';
    else
        return '<strong style="color:red">' . $match[2] . '</strong>';
};

$result = preg_replace_callback($pattern, $replacement, $text);

答案 1 :(得分:0)

不确定我是否真的了解您的需求,但是:

$pat = '#(simply|dummy|five|type\d)#';
$repl = '<strong>$1</strong>';
$new_str = preg_replace("/$pat/", $repl, $string);