如何锚定数组中的句子

时间:2018-05-24 10:13:51

标签: php preg-replace

我想锚定数组中的句子。

<?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"; 

它不能很好地运作。

1 个答案:

答案 0 :(得分:1)

无论你使用什么字符串,都没有达到令人满意的结果,因为:

  • 字符串末尾的名称未被替换
  • 您获取了替换项目周围的重复空格
  • 在href属性的末尾有一个尾随空格
  • 每个名字需要一次传递以进行单个字符串

这就是为什么我建议在一次传递中进行所有替换并使用否定前瞻来检查下一个字符是空格还是字符串的结尾:

$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),具体取决于名称中允许的字符数。)