【问题标题】:Regex - Get all characters after each instance of specific character正则表达式 - 在特定字符的每个实例之后获取所有字符
【发布时间】:2015-08-04 00:29:30
【问题描述】:

我对正则表达式很陌生,只是不知道如何编写一个模式来匹配我需要的东西。任何帮助都会很棒!

我想使用 PHP 和正则表达式来捕获字符串中特定唯一字符(分隔符)之后的每组字符,以及该分隔符第一个实例之前的任何字符集。然后我想将所需的输出“匹配”到 PHP 数组中。

  • 示例分隔符:>
  • 示例字符串:

    $str = 'word1 > word-2 > word.3 > word*4';
    
  • 我想要的匹配:

    array([0] => 'word1', [1] => 'word-2', [2] => 'word.3', [3] => 'word*4',);
    

我查看了以下回复,虽然它们很接近,但它们并不能完全帮助我实现我所需要的:

这是我目前正在使用的 PHP 函数,但它目前只能找到分隔符之间的字符:

function parse_conditions($str, $delimiter='>') {
if (preg_match_all('/' . $delimiter . '(.*?)' . $delimiter . '/s', $str, $matches)) {
    return $matches[1];
}

注意:给定字符串中的项目数可能会有所不同,因此我不能使用需要特定数量分隔符的模式(例如/^(.*?)>(.*?)>(.*?)>$/

【问题讨论】:

  • 你为什么不能在>上分裂?
  • 这里不需要正则表达式。只需使用explode()。
  • 要么将第二个分隔符包装在前瞻中,要么简单地提取不是分隔符的连续字符串 ([^>]+)。

标签: php regex split


【解决方案1】:

您可以简单地将array_mapexplode 一起用作

$str = 'word1 > word-2 > word.3 > word*4';
$result = array_map('trim',  explode('>', $str));
print_r($result);

输出:

Array
(
    [0] => word1
    [1] => word-2
    [2] => word.3
    [3] => word*4
)

你可以Check it here

【讨论】:

  • 这太完美了,谢谢!这么多很棒的答案,以及完成同一件事的多种方法。如前所述,我只是在学习,所以甚至不知道爆炸。再次感谢。
  • 很高兴听到您喜欢这种方式。谢谢你的赞赏。您可以为未来的用户接受这些答案之一。再次感谢
【解决方案2】:

为此,我会使用 preg_split http://php.net/preg_split

<?php
$matches = preg_split('~\s*>\s*~', 'word1 > word-2 > word.3 > word*4');
print_r($matches);

输出:

Array
(
    [0] => word1
    [1] => word-2
    [2] => word.3
    [3] => word*4
)

\s* 表示任意数量的空白字符。

这类似于使用爆炸。

<?php
$matches = explode('>', 'word1 > word-2 > word.3 > word*4');
print_r($matches);

但正如您在爆炸中看到的那样,您有空格:

Array
(
    [0] => word1 
    [1] =>  word-2 
    [2] =>  word.3 
    [3] =>  word*4
)

【讨论】:

  • 感谢您的回答 - 在我努力学习的过程中,我非常感谢您对拆分中发生的事情的解释。有三个很好的答案,每个都可以满足我的需要。我很好奇您是否有任何信息说明为什么 preg_split 比 uchiha 的 explode + trim 答案或 martin-konecny 的 preg_match_all 答案更好。或者也许它们只是不同的方式来做到这一点,两种方式都没有明显的优势。再次感谢。
  • 在编程中有很多不同的方式来做事。我更喜欢尽可能少地调用函数,这就是我选择preg_split 的原因。 @Uchiha 的答案对我来说似乎是最容易阅读的。
  • 很高兴听到你的感谢@chris85
  • 再次感谢您提供的信息。很好的答案。
  • 使用explode() 可以使用$matches = array_map('trim', $matches); 去除空格。只是测试,什么对你来说更快。
【解决方案3】:

如前所述,您可以为此使用爆炸:

$str = 'word1 > word-2 > word.3 > word*4';
print_r(explode(" > " , $str));

不过,为了完整起见,我们也使用 RegEx。

在这种情况下,我们可以告诉正则表达式将所有不是空格和分隔符的字符组合在一起&gt;

preg_match_all('/([^>\s]+)/', $str, $matches);
echo print_r($matches[0]);

# [0] => Array
#    (
#        [0] => word1
#        [1] => word-2
#        [2] => word.3
#        [3] => word*4
#    )

【讨论】:

  • 这是一个很棒的完整答案。结合 Uchiha 的答案(修剪空白),我可以使用explode 或regex 来完成我需要的。谢谢你。我很好奇一种方法是否优于另一种方法?据您所知,explode 比 preg_match_all 更有效吗?
  • 我会在这种情况下使用explode,因为这是它的设计目的,并且其他程序员很容易明白你在做什么。另一方面,RegEx 并不是那么明显。
猜你喜欢
  • 2019-07-24
  • 2011-05-02
  • 2019-11-18
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多