搜索页面并替换一些元素

时间:2016-10-19 13:52:07

标签: php regex

我在页面上有两组标签,首先是

{tip}tooltip text{/tip}

,第二个是

{tip class="someClass"}tooltip text{/tip}

我需要用

替换那些
<span class=„sstooltip”><i>?</i><em>tooltip text</em></span>

我不知道如何处理向<span>标记添加新类的问题。 (工具提示类始终存在)

这是我的正则表达式/\{tip.*?(?:class="([a-z]+)")?\}(.*?)\{\/tip\}/

我想我需要检查数组索引的类值,但这些是不同的,具体取决于{tip}标签版本。我是否需要两个正则表达式,每个版本一个,或者有一些方法来提取和替换类值?

php代码:

$regex = "/\{tip.*?(?:class=\"([a-z]+)\")?\}(.*?)\{\/tip\}/";
$matches = null;
preg_match_all($regex, $article->text, $matches);

if (is_array($matches)) {
    foreach ($matches as $match) {
        $article->text = preg_replace(
            $regex,
            "<span class=tooltip \$1"."><i>?</i><em>"."\$2"."</em></span>",
            $article->text
        );
    }
}

1 个答案:

答案 0 :(得分:1)

这是你的答案(我也让它更健壮):

onRefreshToken()

PCRE(PHP使用,如果内存服务)将自动获取第一个捕获组(获取类)在第一种情况下为空,并且只替换替换中的空字符串。第二种情况是不言自明的。

您的替换代码将如下所示:

{tip(?:\s+class\s*=\s*"([a-zA-Z\s]+)")?}([^{]*){\/tip}

你不需要事先检查正则表达式是否匹配 - $article->text = preg_replace( '/{tip(?:\s+class\s*=\s*"([a-zA-Z\s]+)")?}([^}]*){\/tip}/', '<span class="tooltip $1"><i>?</i><em>$2</em></span>', $article->text ); 所隐含的,正在执行正则表达式匹配,然后替换任何匹配的文本通过该文本的模式。如果没有匹配,则不进行替换。