【发布时间】:2011-10-01 11:09:54
【问题描述】:
为简洁起见...
我想从字符串中取出项目,将它们放入单独的数组中,用 ID 标记替换从字符串中提取的值,解析字符串,然后将提取的项目放回其原始位置(以正确的顺序) .
(如果这是有道理的,那就跳过其余的:D)
我有以下字符串;
“我的句子包含指向 [url] 和 [url] 的 URL,这让我的生活变得困难。”
出于各种原因,我想删除这些 URL。 但我需要保留它们的位置,并在稍后重新插入它们(在处理完字符串的其余部分之后)。
所以我愿意;
“我的句子包含指向 [url] 和 [url] 的 URL,这让我的生活变得困难。”
成为;
“我的句子包含指向 [token1fortheURL] 和 [token2fortheURL] 的 URL,这让我的生活变得困难。”
我已经尝试过几次,各种方式。 我所做的就是撞砖墙并发明新的脏话!
我使用以下代码进行设置;
$mystring = 'my sentence contains URLs to http://www.google.com/this.html and http://www.yahoo.com which makes my life difficult.';
$myregex = '/(((?:https?|ftps?)\:\/\/)?([a-zA-Z0-9:]*[@])?([a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}|([0-9]+))([a-zA-Z0-9-._?,\'\/\+&%\$#\=~:]+)?)/';
$myextractions = array();
然后我做一个 preg_replace_callback;
$matches = preg_replace_callback($myregex,'myfunction',$mystring);
我的功能如下;
function myfunction ($matches) {}
砖墙就是从这里开始发生的。 我可以将东西放入空白提取数组中 - 但它们在函数之外不可用。我可以使用令牌更新字符串,但我无法访问被替换的 URL。 我似乎无法为 preg_replace_callback 中的函数调用添加其他值。
我希望有人能帮忙,因为这让我发疯了。
更新:
根据@Lepidosteus 建议的解决方案, 我想我有以下工作?
$mystring = 'my sentence contains URLs to http://www.google.com/this.html and http://www.yahoo.com which makes my life difficult.';
$myregex = '/(((?:https?|ftps?)\:\/\/)?([a-zA-Z0-9:]*[@])?([a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}|([0-9]+))([a-zA-Z0-9-._?,\'\/\+&%\$#\=~:]+)?)/';
$tokenstart = ":URL:";
$tokenend = ":";
function extraction ($myregex, $mystring, $mymatches, $tokenstart, $tokenend) {
$test1 = preg_match_all($myregex,$mystring,$mymatches);
$mymatches = array_slice($mymatches, 0, 1);
$thematches = array();
foreach ($mymatches as $match) {
foreach ($match as $key=>$match2) {
$thematches[] = array($match2, $tokenstart.$key.$tokenend);
}
}
return $thematches;
}
$matches = extraction ($myregex, $mystring, $mymatches, $tokenstart, $tokenend);
echo "1) ".$mystring."<br/>";
// 1) my sentence contains URLs to http://www.google.com/this.html and http://www.yahoo.com which makes my life difficult.
function substitute($matches,$mystring) {
foreach ($matches as $match) {
$mystring = str_replace($match[0], $match[1], $mystring);
}
return $mystring;
}
$mystring = substitute($matches,$mystring);
echo "2) ".$mystring."<br/>";
// 2) my sentence contains URLs to :URL:0: and :URL:1: which makes my life difficult.
function reinsert($matches,$mystring) {
foreach ($matches as $match) {
$mystring = str_replace($match[1], $match[0], $mystring);
}
return $mystring;
}
$mystring = reinsert($matches,$mystring);
echo "3) ".$mystring."<br/>";
// 3) my sentence contains URLs to http://www.google.com/this.html and http://www.yahoo.com which makes my life difficult.
这似乎行得通?
【问题讨论】:
-
更新:php 版本是 5.2 - 所以不幸的是,像 Lepidosteus 提供的那样的解决方案目前无法工作。如果还有其他方法,请提出建议。
-
根据 Lepidosteus 的想法更新了问题以包含部分答案/解决方案
标签: php extraction preg-replace-callback tokenize