7

所以我看过几篇文章有点太深了,所以我不确定从他们所做的正则表达式中删除什么。

我基本上得到了这个

foo:bar一直到anotherfoo:bar;seg98y34g.?sdebvw h segvu(任何事情都是真的)

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

fooanotherfoo

在做了类似这个可怕的伪代码示例之后

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

编辑

发布后,explode()工作是否足够可靠?就像是

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

6 回答 6

25

explode会做你所要求的,但你可以通过使用current.

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

我不会在这里使用正则表达式(这涉及一些在幕后进行的相对简单的操作),我也不会使用strposwith substr(因为那样会有效地遍历字符串两次)。最重要的是,这为阅读代码的人提供了即时的“啊,是的,这就是作者正在尝试做的事情!” 而不是“等等,又发生了什么事?”

唯一的例外是如果您碰巧知道字符串过长:我不会explode使用 1 Gb 文件。反而:

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

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

于 2012-10-02T19:37:35.410 回答
9

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

$newstring = preg_replace("/(.*?):(.*)/", "$1", $string);
于 2012-10-02T19:35:38.597 回答
3

比其他示例更简洁:

current(explode(':', $string));
于 2012-10-02T19:37:32.630 回答
3

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

$newstring = preg_replace("/(.*?):(.*)/", "$2", $string);
于 2014-03-05T15:50:21.037 回答
0

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

<?php 
  $s = 'anotherfoo:bar;seg98y34g.?sdebvw h segvu';
  $result = array_shift(explode(':', $s));
  echo $result;
?>
于 2012-10-02T19:35:56.173 回答
-1

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

list($beforeColon) = explode(':', $string);
于 2012-10-02T19:36:26.157 回答