簡體   English   中英

PHP substr經過一定的char,一個substr + strpos優雅的解決方案?

[英]PHP substr after a certain char, a substr + strpos elegant solution?

假設我想在一些針char'x 'x'之后返回所有字符:

$source_str = "Tuex helo babe"

通常我會這樣做:

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

你知道更好/更聰明(更優雅的方式)嗎?

不使用regexp不會使它更優雅,也可能更慢。

不幸的是我們做不到:

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

因為當找不到'x'時, strpos返回FALSE (而不是JS中的-1 )。 FALSE將評估為零,並且第一個字符將始終被切斷。

謝謝,

你的第一種方法很好:檢查strpos是否包含x ,如果是,則使用substr獲取任何內容。

但你也可以使用strstr

strstr($str, 'x')

但是當它返回 x開頭的子字符串 ,使用substr來獲取x之后的部分:

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

但這要復雜得多。 所以請改用你的strpos方法。

正則表達式將使它更優雅:

// 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);

我只需要這個,並努力將它保持在一條線上以獲得樂趣:

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

ternary operator在5.3中進行了調整,以實現這一點。

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

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

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);

$item的末尾附加一個' - ',因此它總是在' - '之前返回字符串,即使$item不包含' - ',因為strpos默認返回第一次出現 ' - '的位置。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM