簡體   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