$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 ]
对于那些对正则表达式持谨慎态度的人来说,这里有一个没有疯狂正则表达式语法的解决方案。 曾经真的让我很恼火,这样的东西不是 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));
}