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

时间:2012-10-02 19:32:15

标签: php regex

所以我看过一些文章有点太深,所以我不确定从他们制作的正则表达式语句中删除什么。

我基本上得到了这个

foo:bar 一直到 anotherfoo:bar; seg98y34g。?sdebvw h segvu (一切都真的如此)

我需要一个PHP正则表达式来删除冒号后的所有内容。第一部分可以是任何长度(但它从不包含冒号。因此,在上述两种情况下,我最终都会使用

foo anotherfoo

做了像伪造的代码

这个可怕的例子
$string = 'foo:bar';
$newstring = regex_to_remove_everything_after_":"($string);

修改

发布后,explode()是否能够可靠地运作?像

这样的东西
$pieces = explode(':', 'foo:bar') 
$newstring = $pieces[0];

6 个答案:

答案 0 :(得分:22)

explode可以满足您的要求,但您可以使用current向前迈出一步。

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

我不会在这里使用正则表达式(这涉及到幕后的一些相对简单的操作),我也不会将strpossubstr一起使用(因为这样做会有效地遍历串两次)。最重要的是,这为立即阅读代码的人提供了“啊,是的,这就是作者想要做的!”而不是,“等等,又发生了什么?”

唯一的例外是如果你碰巧知道字符串过长:我不会explode一个1 Gb文件。代替:

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

我也觉得substr不是那么容易阅读:在current(explode中,您可以立即看到分隔符,没有额外的函数调用,并且只有一个变量事件(这使得它不容易出现人为错误)。基本上我将current(explode读作“我正在接受此字符串之前的任何事件的第一个事件”而不是substr,这是“我从0位置开始获取子字符串并继续直到此字符串。“

答案 1 :(得分:8)

您的explode解决方案可以解决问题。如果你真的想出于某种原因使用正则表达式,你可以这样做:

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

答案 2 :(得分:3)

比其他例子更简洁:

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

答案 3 :(得分:2)

你可以使用m.buettner编写的RegEx,但他的例子返回BEFORE':'之前的所有内容,如果你想要':'之后的所有内容只需使用$ 2而不是$ 1:

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

答案 4 :(得分:0)

您可以使用以下内容。演示:http://codepad.org/bUXKN4el

<?php 
  $s = 'anotherfoo:bar;seg98y34g.?sdebvw h segvu';
  $result = array_shift(explode(':', $s));
  echo $result;
?>

答案 5 :(得分:0)

为什么要使用正则表达式?

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