2010-10-27 74 views
12

比方說,我想要返回所有的字符後,一些針char 'x'從:PHP substr經過一定的char,一個substr + strpos優雅的解決方案?

$source_str = "Tuex helo babe"

通常我會做到這一點:

if(($x_pos = strpos($source_str, 'x')) !== FALSE) 
    $source_str = substr($source_str, $x_pos + 1); 

你知道更好/更聰明的(更優雅的方式)來做到這一點?

不使用正則表達式不會使它更優雅,也可能更慢。

不幸的是我們不能做的:

$source_str = substr(source_str, strpos(source_str, 'x') + 1); 

因爲當'x'找不到strpos回報FALSE(而不是-1像JS)。 FALSE將評估爲零,並且第一個字符將始終被截斷。

感謝,

+2

使用你的第一種方法。 – Gumbo 2010-10-27 18:07:14

+0

難道你不能刪除「!== FALSE」,這樣它會更緊湊一點嗎? – Adam 2010-10-27 18:31:03

+0

@Gumbo,恐怕你說得對。 Plz把它寫下來作爲答案,我選擇你的,除非有更好的東西出來。 – 2010-10-28 10:20:55

回答

10

你的第一個辦法是罰款:檢查x是否包含與strpos如果是這樣得到它後,任何與substr

但你也可以使用strstr

strstr($str, 'x') 

但是,因爲這將返回開始子串用x,使用substr得到x之後的部分:

if (($tmp = strstr($str, 'x')) !== false) { 
    $str = substr($tmp, 1); 
} 

但這遠遠不是更復雜。所以請使用strpos方法。

+0

但是,如果找不到針,strstr將返回FALSE,而不是整個字符串。來自PHP 5.3以上的 – 2010-10-27 17:48:37

+0

strstr()接受可選的第三個參數'before_needle',它允許您包含或排除針。所以不需要再使用substr了。 – 2015-09-11 14:23:08

0
if(strpos($source_str, 'x') !== FALSE) 
    $source_str = strstr($source_str, 'x'); 

那麼優雅,但沒有在一開始x

if(strpos($source_str, 'x') !== FALSE) 
    $source_str = substr(strstr($source_str, 'x'),1); 
+0

這將在$ source_str中包含'x',儘管 – Adam 2010-10-27 17:51:03

+0

非常感謝您的回答,但可以說這更優雅,而且速度更慢「如果您只想確定是否在乾草堆內發生特定針,請使用更快更少的內存密集型功能strpos()代替。「 [來源:http://it.php.net/strstr] – 2010-10-27 17:51:12

+0

我很困惑。 'strpos'是檢查子字符串的出現,它用在我的答案中。只有在出現子字符串時,'strstr'纔會返回字符串的一部分。我覺得它更優雅,因爲它不需要輔助變量,在if()行中沒有誤導性的賦值,並且它更短。唯一的缺點是@adam提到 – 2010-10-27 18:04:26

3

的正則表達式將使很多更優雅:

// helo babe 
echo preg_replace('~.*?x~', '', $str); 

// Tuex helo babe 
echo preg_replace('~.*?y~', '', $str); 

但是你可以試試這個:

// helo babe 
echo str_replace(substr($str, 0, strpos($str, 'x')) . 'x', '', $str); 

// Tuex helo babe 
echo str_replace(substr($str, 0, strpos($str, 'y')) . 'y', '', $str); 
-1

Ap在$item的末尾有一個' - ',所以它總是在' - '之前返回字符串,即使$item不包含' - ',因爲strpos默認返回' - '的第一個出現的位置

substr($item,0,strpos($item.'-','-')) 
0

我需要的這一點,並努力保持它在同一行的樂趣想出了這個:

ltrim(strstr($source_str, $needle = "x") ?: $source_str, $needle);

ternary operator改編5.3爲使這一工作。

從PHP 5.3開始,可以省略三元運算符的中間部分。表達式expr1?:如果expr1的計算結果爲TRUE,則expr3返回expr1,否則返回expr3。

NB。 ltrim將在字符串的開頭修剪多個匹配字符。