$string1 = "This is test [example]"; $string2 = "This is test [example][2]"; $string3 = "This [is] test [example][3]";
Как я могу получить следующий результат?
For $string1 -> example For $string2 -> example*2 For $string3 -> is*example*3
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 ]
Для тех, кто опасается регулярного выражения, вот решение без сильного синтаксиса regex. 🙂 Это меня действительно раздражало, что что-то вроде этого не было родным для строковых функций PHP, поэтому я создал один …
// 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)); }