【问题标题】:php preg_split with regex, need a trick?php preg_split 与正则表达式,需要技巧吗?
【发布时间】:2013-01-24 18:54:43
【问题描述】:

这是我的字符串:

$myString = "first second third,el forth, fiveeee, six";

我要捕捉的是:

first
second
third
el forth
fiveeee
six

这是我尝试在 preg_split 中使用正则表达式的方法:

 $myPattern = "[\s,]";

问题是这会分别捕获“el”和“forth”..

我怎样才能欺骗它来捕获 el ?

编辑:

我不清楚.. 我想将 el 捕获为单个数组元素。因为 EL 太短了。我认为它是一个单词。喜欢:

EL CLASSICO,SOMETHING DIFFERENT,SOMETHINGELSEHERE SOMEMORETEXT 应该是:

* `EL CLASSICO`
* `SOMETHING DIFFERENT`
* `SOMETHINGELSEHERE`
* `SOMEMORETEXT`

它们应该用空格或逗号分隔,但如果有 EL 或 LE 之类的内容,则应忽略。

【问题讨论】:

  • 您如何确定是否应将“elth”之类的字符串作为一个项目捕获,而将“first second”作为两个项目捕获?我要说的是,就目前而言,如果程序员不知道实际的字符串是什么,当字符串中的值发生变化时,您就无法可靠地拆分这样的字符串。
  • @MikeBrant 我想确定它是否等于或小于 3 个字符,例如 DER DIE DAS 或 EL 或 LE...
  • 但是“六”有三个字母,所以“六七”会被捕获为一个。
  • @iamnotmaynard 如果它有三个字母就可以了。但如果有“xxx abcd”之类的内容,则不应捕获它,末尾的“xxx”很好,因为它后面没有更多文本。如果有,那么它应该被整体捕获。它不是,只是获取树字母。如果 3 个字母后有逗号,请按原样获取。我想正则表达式太复杂了?

标签: php regex preg-split


【解决方案1】:

问题编辑后没有好的解决方案,igrone

只需str_replace( ',' , ' ' , $myString) 最终str_replace( ' ', ' ' , $myString) 以避免出现双空格或:

preg_replace( '@, ?' , ' ' , $myString)

【讨论】:

    【解决方案2】:
    <?php
    $myString = "first second third,el forth,del fiveeee,six,six seven,four six";
    $myPattern = "/\s*,\s*|(?<=[^\s,]{4})[\s,]+/";
    
    print_r(preg_split($myPattern, $myString));
    ?>
    

    生产

    [0] => first
    [1] => second
    [2] => third
    [3] => el forth
    [4] => del fiveeee
    [5] => six
    [6] => six seven
    [7] => four
    [8] => six
    

    (?&lt;=[^\s,]{4}) 是一个positive look-behind assertion。只有在前面有四个非分隔符字符时才成功(但它不匹配字符本身,它只检查它们是否存在)。如果前一个单词太短,这允许它不会拆分。 但如果分隔符包含逗号,它将始终拆分——这就是 \s*,\s*| 的用途。

    【讨论】:

    • 谢谢完美。我想我需要一个小时来理解这一点。希望如此。也许一天......谢谢。
    • 为什么括号中是肯定的后向断言?
    • 代替:\s*,\s*|为什么是简单的,|不够,如果这只是用逗号分隔?
    • 正则表达式使用括​​号对子表达式进行分组。所以你可以说,例如,(ab)* 匹配 abababababab(等等),但不能匹配 abbaba。在这种情况下,子表达式开头的?&lt;= 表示将此子表达式视为正向回溯。
    • 对于\s*,\s*|,它还允许逗号周围有空格。这允许six, six , sixsix,six,six 一样工作。
    【解决方案3】:
    implode(' ', preg_split('/,\s*/', $myString));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-17
      • 2019-06-24
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多