所以我看过一些文章有点太深,所以我不确定从他们制作的正则表达式语句中删除什么。
我基本上得到了这个
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];
答案 0 :(得分:22)
explode
可以满足您的要求,但您可以使用current
向前迈出一步。
$beforeColon = current(explode(':', $string));
我不会在这里使用正则表达式(这涉及到幕后的一些相对简单的操作),我也不会将strpos
与substr
一起使用(因为这样做会有效地遍历串两次)。最重要的是,这为立即阅读代码的人提供了“啊,是的,这就是作者想要做的!”而不是,“等等,又发生了什么?”
唯一的例外是如果你碰巧知道字符串过长:我不会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);