【问题标题】:I want to split a string with preg_split and surround the results我想用 preg_split 分割一个字符串并包围结果
【发布时间】:2014-11-27 00:54:30
【问题描述】:

我正在尝试使用 preg_split 拆分字符串,获取结果,用自定义数据包围它们,然后将它们重新插入到原始字符串中。

例如:

$string="this is text [shortcode] this is also text [shortcode2] this is text";

之后,我希望字符串等于:

$string="<span id='0'>this is text </span>[shortcode]<span id='1'> this is also text </span>[shortcode2]<span id='2'>this is text</span>";

我成功地将字符串拆分为一个数组:

$array=preg_split(/\[[^\]]*\]/,$string);

然后我尝试了一个 for next 循环来替换值 - 效果很好,除非数组值在字符串中具有相同的匹配项。

感谢任何帮助 - 或其他可能更好的方法。

【问题讨论】:

    标签: php regex string preg-split


    【解决方案1】:

    preg_split() 是错误的工具,我建议使用回调。

    下面是一个帮助您入门的示例,您可以在此过程中根据需要对其进行修改。

    $str = preg_replace_callback('~(?:\[[^]]*])?\K[^[\]]+~', 
         function($m) { 
            static $id = 0;                                
            return "<span id='".$id++."'>$m[0]</span>"; 
         }, $str);
    

    eval.in demo

    【讨论】:

    • 这很棒而且效果很好,但是我的正则表达式选择的是括号内的内容,而不是括号外的内容。我正在根据短代码名称构建正则表达式 - 这很重要,因为我需要避免使用杂散括号。这是我正在创建的正则表达式的示例。 regex101.com/r/pR6qP4/2 你知道反转这个正则表达式选择的简单方法吗?在我正在搜索的示例文本中,我使用了可能的 9 个短代码中的两个。
    • 你想如何反转正则表达式,你能在你发布链接的所有数据中提供一个例子吗?
    • 为了让你的回调工作,我需要选择所有可能的短代码周围的数据。这是一个更简单的正则表达式 - 只需搜索两个简码。 regex101.com/r/pR6qP4/3 如前所述,我现在正在寻找一种方法来选择除短代码之外的所有内容。
    • 效果很好。它被杂散的括号绊倒,我也试图支持嵌套的短代码。一直试图以有限的成功来解决它。 link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    相关资源
    最近更新 更多