[英]PHP Regex to remove everything after a character
因此,我看過幾篇文章,內容有些過深,所以我不確定要從它們發表的正則表達式中刪除什么。
我基本上有這個
foo:bar一直到另一個 foo: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];
explode
您的要求,但是您可以通過使用current
使其一步一步。
$beforeColon = current(explode(':', $string));
我不會在這里使用正則表達式(在幕后進行一些相對簡單的操作),也不會將strpos
與substr
一起使用(因為這實際上會遍歷字符串兩次)。 最重要的是,這為閱讀代碼的人提供了立即的提示,“啊,是的,這就是作者正在嘗試做的!” 而不是“等等,又會發生什么?”
唯一的例外是,如果您碰巧知道該字符串過長:我不會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.