正则表达式 - 获取特定字符后面的所有字符

4

我对正则表达式非常陌生,无法编写匹配我需要的模式。希望能得到帮助!

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

  • Example delimiter: >
  • Example string:

    $str = 'word1 > word-2 > word.3 > word*4';
    
  • My desired match:

    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];
}

注意:一个给定字符串中的项数可能会有所变化,因此我不能使用期待特定数量分隔符的模式(例如/^(.*?)>(.*?)>(.*?)>$/)。


为什么你不能只在 > 上分割呢? - vks
这里不需要正则表达式,只需使用explode()函数。 - Ulver
要么将第二个定界符包装在前瞻中,要么仅提取不是定界符([^>]+)的连续字符串。 - mario
3个回答

4

您可以简单地使用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
)

您可以在此处查看:点击链接

太好了,谢谢!有很多好的答案,而且有多种方法可以完成同样的事情。正如我所提到的,我只是在学习,所以甚至不知道explode。再次感谢。 - Dylan Moffett
很高兴听到您喜欢这种方式。感谢您的赞赏。您可以为未来的用户接受其中一个答案。再次感谢。 - Narendrasingh Sisodia

1
正如提到的,您可以使用explode来实现这一点:
$str = 'word1 > word-2 > word.3 > word*4';
print_r(explode(" > " , $str));

然而为了完整起见,让我们也使用正则表达式。
在这种情况下,我们可以告诉正则表达式将所有不是空格和分隔符>的字符分组在一起:
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更有效吗? - Dylan Moffett
在这种情况下,我会使用explode,因为它是专门设计用于此目的的,并且其他程序员很容易看出你正在做什么。另一方面,正则表达式并不那么显而易见。 - Martin Konecny

1
我会使用 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* 表示任意数量的空格字符。
这类似于使用 explode。
<?php
$matches = explode('>', 'word1 > word-2 > word.3 > word*4');
print_r($matches);

但是您会发现,使用explode函数后会保留空格:

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

感谢您的回答 - 由于我正在努力学习,因此非常感谢对split中发生的事情进行解释。已经有三个很好的答案可以满足我的需求。我想知道preg_split为什么比uchiha的explode + trim答案或martin-konecny的preg_match_all答案更好。或者它们只是不同的方法,没有明显的优势。再次感谢。 - Dylan Moffett
编程中有许多不同的方法来完成任务。我更喜欢尽可能少地调用函数,这就是为什么我选择了 preg_split。@Uchiha 的答案对我来说似乎最容易阅读。 - chris85
很高兴听到这样的赞扬,感谢@chris85。 - Narendrasingh Sisodia
太棒了,再次感谢提供的信息。所有回答都很好。 - Dylan Moffett
1
使用 explode() 函数,可以使用 $matches = array_map('trim', $matches); 来去除空格。只需测试一下,看哪种方法更快。 - rabudde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接