Preg_replace 和 Preg_replace_callback
Preg_replace and Preg_replace_callback
我正在更新我的编码并从 preg_replace
转向函数 preg_replace_callback
。首先我使用了两个数组,它们替换了一段文本中的所有匹配项。
我已经设置了以下新代码,但我 运行 遇到了一些问题:
<?php
$inhoud = " dit is een test versie, waarin [alum] staat [alum] & [fotoalbums] om [intern=test]te[/intern] vervangen<p>";
function parse_callback($match) {
$hit = $match[0];
switch ($hit){
case '[alum]':
return "<a href=\"/linktype1/\">link1</a>";
break;
case '[fotoalbums]':
return "<a href=\"/linktype2/\">link2</a>";
break;
case '[intern]':
return "<a href=\"". $match[1] ."\">$match[2]</a>";
break;
default:
//return "UNKNOWN:$match";
return var_dump($match);
}
}
$Patroon = "'\[intern=(.*?)\](.*?)\[\/intern\]'";
$Patroon = "'\[fotoalbums\]'";
$Patroon = "'\[alum\]'";
$inhoud = preg_replace_callback($Patroon, parse_callback, $inhoud);
?>
$Patroon
中的后两个没有问题,这些将被更新,但我无法更新第一个,因为找到的匹配项将是完整的字符串。 $match
还将包含 $inhoud
中与 (.*?)
匹配的文本片段,但我无法在开关中处理这些文本。
有关如何解决此问题或更好的编码方法的任何建议。
上面的例子只是会匹配的几个选项,实际的列表要大得多。
首先,您应该将函数名称作为字符串传递:"parse_callback"
.
如您所见,match[0]
将 return 整个匹配文本 ("[intern=test]te[/intern]"
)。您可以在 group:
中捕获标签名称
$Patroon = "'\[(intern)=(.*?)\](.*?)\[/intern\]'";
- 注意
(intern)
中的括号
这样,标签名称将由 $match[1]
编辑。return。
并将这种方法用于所有模式:
$Patroon = array(
"'\[(intern)=(.*?)\](.*?)\[/intern\]'",
"'\[(fotoalbums|alum)\]'"
);
代码
<?php
$inhoud = " dit is een test versie, waarin [alum] staat [alum] & [fotoalbums] om [intern=test]te[/intern] vervangen<p>";
function parse_callback($match) {
//check the value of the first capture
$hit = $match[1];
switch ($hit){
case 'alum':
return "<a href=\"/linktype1/\">link1</a>";
break;
case 'fotoalbums':
return "<a href=\"/linktype2/\">link2</a>";
break;
case 'intern':
return "<a href=\"$match[2]\">$match[3]</a>";
break;
default:
//return "UNKNOWN:$match";
return var_dump($match);
}
}
$Patroon = array(
"'\[(intern)=(.*?)\](.*?)\[/intern\]'",
"'\[(fotoalbums|alum)\]'"
);
$inhoud = preg_replace_callback($Patroon, "parse_callback", $inhoud);
echo $inhoud;
?>
输出
dit is een test versie, waarin <a href="/linktype1/">link1</a> staat <a href="/linktype1/">link1</a> & <a href="/linktype2/">link2</a> om <a href="test">te</a> vervangen<p>
我正在更新我的编码并从 preg_replace
转向函数 preg_replace_callback
。首先我使用了两个数组,它们替换了一段文本中的所有匹配项。
我已经设置了以下新代码,但我 运行 遇到了一些问题:
<?php
$inhoud = " dit is een test versie, waarin [alum] staat [alum] & [fotoalbums] om [intern=test]te[/intern] vervangen<p>";
function parse_callback($match) {
$hit = $match[0];
switch ($hit){
case '[alum]':
return "<a href=\"/linktype1/\">link1</a>";
break;
case '[fotoalbums]':
return "<a href=\"/linktype2/\">link2</a>";
break;
case '[intern]':
return "<a href=\"". $match[1] ."\">$match[2]</a>";
break;
default:
//return "UNKNOWN:$match";
return var_dump($match);
}
}
$Patroon = "'\[intern=(.*?)\](.*?)\[\/intern\]'";
$Patroon = "'\[fotoalbums\]'";
$Patroon = "'\[alum\]'";
$inhoud = preg_replace_callback($Patroon, parse_callback, $inhoud);
?>
$Patroon
中的后两个没有问题,这些将被更新,但我无法更新第一个,因为找到的匹配项将是完整的字符串。 $match
还将包含 $inhoud
中与 (.*?)
匹配的文本片段,但我无法在开关中处理这些文本。
有关如何解决此问题或更好的编码方法的任何建议。 上面的例子只是会匹配的几个选项,实际的列表要大得多。
首先,您应该将函数名称作为字符串传递:"parse_callback"
.
如您所见,match[0]
将 return 整个匹配文本 ("[intern=test]te[/intern]"
)。您可以在 group:
$Patroon = "'\[(intern)=(.*?)\](.*?)\[/intern\]'";
- 注意
(intern)
中的括号
这样,标签名称将由 $match[1]
编辑。return。
并将这种方法用于所有模式:
$Patroon = array(
"'\[(intern)=(.*?)\](.*?)\[/intern\]'",
"'\[(fotoalbums|alum)\]'"
);
代码
<?php
$inhoud = " dit is een test versie, waarin [alum] staat [alum] & [fotoalbums] om [intern=test]te[/intern] vervangen<p>";
function parse_callback($match) {
//check the value of the first capture
$hit = $match[1];
switch ($hit){
case 'alum':
return "<a href=\"/linktype1/\">link1</a>";
break;
case 'fotoalbums':
return "<a href=\"/linktype2/\">link2</a>";
break;
case 'intern':
return "<a href=\"$match[2]\">$match[3]</a>";
break;
default:
//return "UNKNOWN:$match";
return var_dump($match);
}
}
$Patroon = array(
"'\[(intern)=(.*?)\](.*?)\[/intern\]'",
"'\[(fotoalbums|alum)\]'"
);
$inhoud = preg_replace_callback($Patroon, "parse_callback", $inhoud);
echo $inhoud;
?>
输出
dit is een test versie, waarin <a href="/linktype1/">link1</a> staat <a href="/linktype1/">link1</a> & <a href="/linktype2/">link2</a> om <a href="test">te</a> vervangen<p>