【问题标题】:PHP preg_split, expression i curly brackets and saving the delimitersPHP preg_split,表达式 i 大括号并保存分隔符
【发布时间】:2023-03-19 07:42:01
【问题描述】:

我已经为此苦苦挣扎了半天,但似乎找不到答案。请帮助一个菜鸟。 :)

我有一个字符串,它由几个用大括号括起来的句子组成。它看起来像这样:

{Super duper extra text.} {真棒另一个文本!} {我们又来了...}

现在我想拆分它。

我发现我可以搜索 .} { 等模式。所以我这样做了:

$key = preg_split('/[!?.]{1,3}\} \{/',$key);

但是这样我失去了分隔符,我失去了所有那些。 ! ?等在句末。

我试着这样做:

$key = preg_split('/([!?.]{1,3}\} \{)/',$key, -1, PREG_SPLIT_DELIM_CAPTURE);
$sentences = array();

for ($i=0, $n=count($key)-1; $i<$n; $i+=2) {
$sentences[] = $key[$i].$key[$i+1]."<br><br>";
}

但是这段代码永远不会加载,所以我认为它有问题。但是什么?

提前致谢。

【问题讨论】:

    标签: php regex delimiter preg-split


    【解决方案1】:

    您不需要拆分它,只需调用 preg_match() 即可。匹配的组将产生一个数组。分组在()[^}]+ 中的表达式匹配直到但不包括下一个} 的所有字符。您想要的输出值将在 $matches[1] 子数组中。

    $input = "{Super duper extra text.} {Awesome another text!} {And here we go again...}";
    $matches = array();
    preg_match_all('/\{([^}]+)\}/', $input, $matches);
    print_r($matches);
    
    Array
    (
        [0] => Array
            (
                [0] => {Super duper extra text.}
                [1] => {Awesome another text!}
                [2] => {And here we go again...}
            )
    
        [1] => Array
            (
                [0] => Super duper extra text.
                [1] => Awesome another text!
                [2] => And here we go again...
            )
    
    )
    

    【讨论】:

    • 这在我有一个包含多个连接在一起的 JSON 子字符串的字符串的情况下非常有效。例如:'{"id":"Q3","name":"Question 3"} {"id":"Q4","name":"Question 4"}'。唯一需要注意的是,如果其中一个子字符串中有一个右大括号,则正则表达式将在其上停止。
    • @MikeFinch 这让事情变得复杂了。如果您的字符串连接但始终相邻{}{},您可以preg_split('/\}\{/', $str)}{ 连接处拆分字符串,但您需要恢复关闭} 或打开{preg_split() 将消除。如果可能,请尝试让您的数据源输出一个正确的 JSON 对象数组,以 [{...},{...},{...}] 开头
    • 确实比它需要的复杂。我之前没有提到的另一个细节是数据源在有效的 JSON 子字符串之间添加了 '; | ' 分隔符。唉,我被数据源困住了。我已经得出了您建议使用preg_split() 的相同想法,其模式为"/\};[^{]*\{/"。然后,我必须重新添加缺少的大括号。
    【解决方案2】:

    我怀疑您是否需要 preg_split()。根据您的描述,听起来像:

     $array = explode('} {', trim($string, '{}'));
    

    ...会完成这项工作。

    【讨论】:

    • 留下我的答案,因为它解释了适当的正则表达式,但 +1 更简单的解决方案。
    【解决方案3】:

    试试这个是否可行,在中间大括号正斜杠之前使用。

    $keywords = preg_split("/[\{\}]/", "{hypertext} language, programming");
    print_r($keywords);
    

    【讨论】:

      猜你喜欢
      • 2012-08-24
      • 1970-01-01
      • 2014-09-20
      • 2018-04-27
      • 2018-05-02
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多