PHP正则表达式:删除字符后的所有内容

7

我看到了一些深入的文章,所以不确定要从正则表达式语句中删除什么。

我基本上有这个

foo:bar all the way to anotherfoo:bar;seg98y34g.?sdebvw h segvu(任何东西都可以)

我需要一个PHP正则表达式来删除冒号后面的 EVERYTHING。 第一部分可以是任意长度(但它从不包含冒号)。 因此,在上述两种情况下,我将以如下内容结束:

fooanotherfoo

执行类似于以下可怕伪代码的操作之后

$string = 'foo:bar';
$newstring = regex_to_remove_everything_after_":"($string);

编辑

发布后,使用explode()是否足够可靠? 像这样:

$pieces = explode(':', 'foo:bar') 
$newstring = $pieces[0];

1
这可以更轻松地使用strpos和子字符串完成...为什么要用锤子打苍蝇呢? - geekman
无论如何,我也在等待解决方案,所以点赞。 - geekman
如果您可以可靠地说冒号是分隔符,请使用explode。 - Matthew Blancarte
我一开始认为正则表达式可能是唯一的方法,直到(当然)发布后,我想到了可能使用explode?我考虑删除它并测试explode,但我会保留它以便a)帮助那些偶然遇到它的人们和b)看看是否有更好的解决方案 :) - Xhynk
6个回答

25

explode可以实现你所要求的功能,但是你可以使用current来简化操作。

$beforeColon = current(explode(':', $string));

在这里我不会使用正则表达式(虽然可以实现相对简单的操作,但背后涉及了一些工作),也不会使用 strpossubstr 的组合(因为那样等效于两次遍历字符串)。最重要的是,这使得阅读代码的人立刻明白,“啊,这就是作者想要做的事情!”而不是“等等,到底发生了什么?”

唯一的例外是如果你知道该字符串非常长:我不会使用 explode 对一个1 GB的文件进行分割。取而代之的是:

$beforeColon = substr($string, 0, strpos($string,':'));

我也觉得substr不太容易阅读:在current(explode中,你可以立即看到分隔符,而无需额外的函数调用,并且只有一个变量实例(这使其不容易出现人为错误)。基本上,我将current(explode解读为“我正在获取此字符串之前的任何内容的第一个实例”,而不是substr,“我从0位置开始获取子字符串,并继续直到该字符串结束”。


2
+1 为向我展示 current() 而感谢 - 这将简化我使用上述方法的许多其他函数。同时也感谢你解释了为什么我不应该在处理如此简单的事情时使用正则表达式/strpos。谢谢! - Xhynk
current() 只是魔法。人们从哪里学到这些东西的呢? - Akshay K Nair

9

您的 explode 解决方案已经成功了。如果您确实想出于某种原因使用正则表达式,您可以简单地这样做:

$newstring = preg_replace("/(.*?):(.*)/", "$1", $string);

谢谢你的输入!我会保存那个正则表达式,以备将来需要使用! - Xhynk

3

比其他示例更加简明:

current(explode(':', $string));

3
你可以使用 m.buettner 编写的正则表达式,但他的示例返回 ':' 之前的所有内容,如果你想要 ':' 后面的所有内容,只需使用 $2 替换 $1:
$newstring = preg_replace("/(.*?):(.*)/", "$2", $string);

0
你可以使用类似以下的代码。示例:http://codepad.org/bUXKN4el
<?php 
  $s = 'anotherfoo:bar;seg98y34g.?sdebvw h segvu';
  $result = array_shift(explode(':', $s));
  echo $result;
?>

-1
为什么要使用正则表达式?
list($beforeColon) = explode(':', $string);

也许如果我们使用 preg_match 会有帮助。 - Agnes Palit

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