2012-06-08 4 views
4
$string1 = "This is test [example]"; 
$string2 = "This is test [example][2]"; 
$string3 = "This [is] test [example][3]"; 

Как я могу получить следующий результат?Как получить строку между двумя символами [string]? PHP

For $string1 -> example 
For $string2 -> example*2 
For $string3 -> is*example*3 
+0

на любом языке, цикл через символы, если вы столкнулись с '[' установить флаг и захватить все, пока ']' и незадана флаг :) – Jashwant

ответ

7
preg_match_all('/\[([^\]]+)\]/', $str, $matches); 

php > preg_match_all('/\[([^\]]+)\]/', 'This [is] test [example][3]', $matches); 
php > print_r($matches); 
Array 
(
    [0] => Array 
     (
      [0] => [is] 
      [1] => [example] 
      [2] => [3] 
     ) 

    [1] => Array 
     (
      [0] => is 
      [1] => example 
      [2] => 3 
     ) 

) 

А вот объяснение rregex:

\[ # literal [ 
(# group start 
    [^\]]+ # one or more non-] characters 
) # group end 
\] # literal ] 
+0

Можете ли вы объяснить regex пожалуйста? Насколько я понял. '/', чтобы запустить выражение регулярных выражений. '\' для выхода '' '. '[' включить набор символов? Правильно ? Можете ли вы объяснить полное регулярное выражение? – Jashwant

5

Для тех, кто опасается регулярных выражений, вот решение без ума, что синтаксис регулярных выражений. :-) Раньше действительно раздражает меня, что-то вроде этого не было родным для строковых функций РНР, так что я построил один ...

// Grabs the text between two identifying substrings in a string. If $Echo, it will output verbose feedback. 
function BetweenString($InputString, $StartStr, $EndStr=0, $StartLoc=0, $Echo=0) { 
    if (!is_string($InputString)) { if ($Echo) { echo "<p>html_tools.php BetweenString() FAILED. \$InputString is not a string.</p>\n"; } return; } 
    if (($StartLoc = strpos($InputString, $StartStr, $StartLoc)) === false) { if ($Echo) { echo "<p>html_tools.php BetweenString() FAILED. Could not find \$StartStr '{$StartStr}' within \$InputString |{$InputString}| starting from \$StartLoc ({$StartLoc}).</p>\n"; } return; } 
    $StartLoc += strlen($StartStr); 
    if (!$EndStr) { $EndStr = $StartStr; } 
    if (!$EndLoc = strpos($InputString, $EndStr, $StartLoc)) { if ($Echo) { echo "<p>html_tools.php BetweenString() FAILED. Could not find \$EndStr '{$EndStr}' within \$InputString |{$InputString}| starting from \$StartLoc ({$StartLoc}).</p>\n"; } return; } 
    $BetweenString = substr($InputString, $StartLoc, ($EndLoc-$StartLoc)); 
    if ($Echo) { echo "<p>html_tools.php BetweenString() Returning |'{$BetweenString}'| as found between \$StartLoc ({$StartLoc}) and \$EndLoc ({$EndLoc}).</p>\n"; } 
    return $BetweenString; 
} 

Конечно, это может быть сжата совсем немного. Для того, чтобы спасти кого-то еще усилие очистки его:

// Grabs the text between two identifying substrings in a string. 
function BetweenStr($InputString, $StartStr, $EndStr=0, $StartLoc=0) { 
    if (($StartLoc = strpos($InputString, $StartStr, $StartLoc)) === false) { return; } 
    $StartLoc += strlen($StartStr); 
    if (!$EndStr) { $EndStr = $StartStr; } 
    if (!$EndLoc = strpos($InputString, $EndStr, $StartLoc)) { return; } 
    return substr($InputString, $StartLoc, ($EndLoc-$StartLoc)); 
} 
Смежные вопросы