gpt4 book ai didi

php - 带有正则表达式的 XHP 用于链接替换

转载 作者:行者123 更新时间:2023-12-05 07:53:40 25 4
gpt4 key购买 nike

我正在尝试实现一个简单的函数,它给定文本输入,在检测到链接时返回用 xhp_a 修改的文本,在段落 xhp_p 中。

考虑这个类

class Urlifier {

protected static $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";


public static function convertParagraphWithLink(?string $input):xhp_p{
if (!$input)
return <p></p>;
else
{
if (preg_match(self::$reg_exUrl,$input,$url_match)) //match found
{
return <p>{preg_replace($reg_exUrl, '<a href="'.$url_match[0].'>'.$url_match[0].'</a>', $input)}<p>;
}else{//no link inside
<p>{$input}</p>
}
}
}

这里的问题是 xhp 转义 html 并且链接没有按预期显示。我想这是因为没有按预期创建 dom 层次结构(例如使用 appendChild 方法),因此 regex 替换的所有内容都是一个字符串。

所以我解决这个问题的另一种方法是将 preg_match_callback 与回调函数一起使用,该回调函数将创建 xhp_a 并添加到 xhp_p 下的层次结构但是那也不管用。

我哪里错了吗?如果不存在任何安全风险/仅通过在客户端而不是服务器上加载 html 来查找和替换负载会带来更大的开销吗?

感谢您的宝贵时间!

最佳答案

由于 XHP 维护映射到 DOM 的对象层次结构,因此简单地替换字符串的一部分不会创建任何新对象。要操作 XHP 对象,应该使用相应的方法,例如appendChild.

这是一个示例,说明如何通过 XHP 操作实现您的需求。

class Urlifier {

public static function convertParagraphWithLink(
?string $input,
): xhp_p {
$url_pattern = re"/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
if (HH\Lib\Str\is_empty($input)) {
return <p/>;
}
$input = $input as nonnull;
// Extract links
$link_matches = HH\Lib\Regex\every_match($input, $url_pattern);
$links = HH\Lib\Vec\map($link_matches, $m ==> $m[0]);
$a_elements = HH\Lib\Vec\map($links, $link ==> <a href={$link}>{$link}</a>);
// Extract all pieces between matches
$texts = HH\Lib\Regex\split($input, $url_pattern);
$p_elements = HH\Lib\Vec\map($texts, $text ==> <p>{$text}</p>);

// Merge texts and links
$pairs = HH\Lib\Vec\zip($p_elements, $a_elements);
$elements = HH\Lib\Vec\flatten($pairs);

// Because there's one more p element than a element, append last p
$elements[] = HH\Lib\C\last($p_elements);

$result = <p/>;
$result->appendChild($elements);

return $result;
}

关于php - 带有正则表达式的 XHP 用于链接替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32341781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com