我想锚定数组中的句子。
<?php
$names = array('sara', 'max', 'alex');
foreach ($names as $dt) {
$name = '@' . $dt;
$text = preg_replace('/(' . $name . '\s)/', ' <a href=' . $dt . '>\1</a> ', $text);
}
echo $text;
?>
当我这样的句子运作良好时。
$text = "@sara @alex @max";
但是当我的判决就像这样
$text = "hello @sara hello @max hello @alex";
它不能很好地运作。
答案 0 :(得分:1)
无论你使用什么字符串,都没有达到令人满意的结果,因为:
这就是为什么我建议在一次传递中进行所有替换并使用否定前瞻来检查下一个字符是空格还是字符串的结尾:
$xml1 = new SimpleXMLElement(file_get_contents('answer.xml'));
$counter = 0;
$result = [];
foreach ($xml1->children() as $child) {
if ($child->getName() === "mspace") {
$result[++$counter] = [];
continue;
}
$result[$counter][] = $child->saveXML();
}
$result = array_map(function($x){
return implode("", $x);
}, $result);
print_r($result);
请注意,您可以将$text = "hello @sara hello @max hello @alex";
$names = array('sara', 'max', 'alex');
$pattern = '~@(' . implode('|', $names) . ')(?!\S)~';
$text = preg_replace($pattern, '<a href="$1">$0</a>', $text);
替换为(?!\S)
(或(?!\w)
,具体取决于名称中允许的字符数。)