繁体   English   中英

PHP Regex删除字符后的所有内容

[英]PHP Regex to remove everything after a character

因此,我看过几篇文章,内容有些过深,所以我不确定要从它们发表的正则表达式中删除什么。

我基本上有这个

foo:bar一直到另一个 foo: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];

explode您的要求,但是您可以通过使用current使其一步一步。

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

我不会在这里使用正则表达式(在幕后进行一些相对简单的操作),也不会将strpossubstr一起使用(因为这实际上会遍历字符串两次)。 最重要的是,这为阅读代码的人提供了立即的提示,“啊,是的,这就是作者正在尝试做的!” 而不是“等等,又会发生什么?”

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

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

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

您的explode解决方案可以解决问题。 如果您出于某些原因确实想要使用正则表达式,则只需执行以下操作:

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

比其他示例更简洁:

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM