Ради краткости ...
Я хочу извлечь элементы из строки, поместить их в отдельный массив, заменить значения, извлеченные из строки, токенами ID'd, проанализировать строку, а затем вернуть извлеченные элементы в их исходные позиции (в правильном порядке) ,
(Если это имеет смысл, пропустите остальное: D)
У меня есть следующая строка;
«Мое предложение содержит URL-адреса [url] и [url], что усложняет мою жизнь».
По разным причинам я хотел бы удалить URL-адреса.
Но мне нужно сохранить их место и установить их позже (после манипулирования остальной строкой).
Таким образом, я хотел бы;
«Мое предложение содержит URL-адреса [url] и [url], что усложняет мою жизнь».
стать;
«В моем предложении содержатся URL-адреса [token1fortheURL] и [token2fortheURL], что усложняет мою жизнь».
Я пытался сделать это несколько раз, разными способами.
Все, что я делаю, это бью кирпичные стены и изобретаю новые ругательства!
Я использую следующий код для настройки;
$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.
Я надеюсь, что кто-то может помочь, потому что это сводит меня с ума.
UPDATE:
На основании решения, предложенного @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.
Это похоже на работу?