- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想说我知道关于 SO 的类似问题,但由于我的情况略有不同,我认为最好打开一个新问题。我确实搜索了一个小时,我可能遗漏了什么,如果是这样请原谅我。
问题:我正在开发一个类似于 facebook 的功能:用户可以发布一条可能包含多个链接的文本消息,这些链接可能会或很多不会放在 anchor 标签中,并且可能具有不同的协议(protocol)(http、https , ftp,....)
我需要
检测这些链接并可能尝试检索它们(就像 facebook)。我猜这是 jquery 的任务?
我还需要可靠地检测外部链接并将它们更改为 mysite.com/external?url=thelink。我认为这是 php 的任务(因为我不能相信来自客户端的输入,对吧?)
无论如何,由于链接不能保证在 anchor 标记中,使用 dom 解析器似乎不太可靠(或者我错了)?我在网上找到了一个简单的正则表达式(顺便说一句,我对正则表达式很糟糕)我认为我可以利用它(通过添加更多协议(protocol))
$strText = preg_replace( '/(http|ftp)+(s)?:(\/\/)((\w|\.)+)(\/)?(\S+)?/i', '<a href="\0">\4</a>', $strText );
一些在这方面有经验的专家能给我指出正确的方向吗?
最佳答案
是的,这绝对是您想要在服务器端执行的操作。首先,如果您接受包含 HTML 标记的用户输入,您应该使用像 HTML Purifier 这样的良好 HTML 过滤器对其进行清理。 . (这也将使他们的输入更容易解析更复杂的标记。)
这应该在单个 preg_replace() 语句中是可行的,但我会把它分成这样的东西:
$hrefPattern = '/<a[^>]+?href="(.+?)".*?>/i';
$outLink = 'http://mysite.com/external?url=';
$offset = 0;
while(preg_match($hrefPattern, $text, $hrefMatches, PREG_OFFSET_CAPTURE, $offset))
{
$hrefInner = $hrefMatches[1][0];
$offset = $hrefMatches[1][1];
echo $hrefInner . "\r\n";
if(strpos($hrefInner, '://') !== false)
{
$externalUrl = $outLink . rawurlencode($hrefInner);
$text = str_replace($hrefInner, $externalUrl, $text);
$offset += strlen($externalUrl);
}
}
preg_match() documentation很好地解释了这一点。我们基本上只是在查找每个 <a ... href="">
标签,捕获它的内容,如果它以 (anything)://
开头,则重新格式化它, 并重复直到 $text
中不再有链接为止.如果重新格式化链接,则需要 rawurlencode()
您抓取的链接以确保新链接是 valid .
Facebook 为它的链接片段抓取内容的方式,我想,比这复杂得多,但是是的 - 你会想要发送一个 AJAX 请求到一个 PHP 页面,该页面抓取相关链接并生成任何你想要的片段。不过,相当涉及的内容更多 - 如果页面不存在、重定向到另一个页面、具有无效标记、不同的文档类型等,您将不得不处理。 p>
希望对您有所帮助!
关于php - 检测和编辑外部链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6853416/
我添加了编辑按钮 self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButto
我试图在运行时“干净地”更改 UIBarButtonItem 文本,以便可以切换编辑/完成模式。然而,每次我在运行时更改 title 属性时,动画看起来都很笨拙。我正在寻找模拟联系人应用程序中“编辑/
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想更改 INI 文件中的一些值。不幸的是,我在 2 个不同的部分有键,它们共享相同的名称但需要不同的值。我的代码使用 Get-IniContent函数来自 PsIni . 示例 INI 文件: [P
是否有通知或委托(delegate)方法可用于检测表格 View 何时进入编辑状态? 我想要做的是检测表正在编辑,然后显示一个额外的行,上面写着“添加新项目”或类似的东西。 我尝试在加载 View C
例如,我试图从 svg 读取样式块,我可以获取类型但不能获取字符串。 $svgTemplate = new SimpleXMLElement($_POST['SvgTemplateImport']);
我可以使用 self.navigationItem.leftBarButtonItem = self.editButtonItem; 通过按下导航面板上的编辑按钮让 UITableViewContro
我正在使用markitup!作为 Markdown 编辑器( example )。 目前,我需要按预览按钮(绿色勾号)来显示预览面板。 我希望自动显示预览 - 我怎样才能实现这一点? 最佳答案 我没有
我的处境非常糟糕。我丢失了源代码,客户需要在应用程序中进行一些更改。想想一个编辑程序集的例子:Test.dll,然后添加代码行,最后重新编译它 所以我的问题是: -可以这样做吗? -如果可能的话,什么
我使用了一些 JavaScript 来通过按钮更改段落元素的内容。它工作正常,但我还想让按钮控制标题和附图。给我指明正确的方向吗? 这是我用来更改段落的代码 .... 谢谢! 最佳答案 尝试将 Ja
是否有任何 Emacs lisp 插件可以让我轻松地在 yaml 文件中编辑或输入数据。 例如: --- sample yaml file ---Name : Addr :City :State:Zi
新手Java问题,我确定已经解决了,但是在任何地方都找不到解决方案:( 我想使用这里包含的java程序http://sourceforge.net/projects/ant-tibco/files/
在我的网页中,我使用了 gridview。在这个 GridView 中,它显示了一组用户信息。我刚刚从智能标签菜单中添加了一个按钮。我的要求是当我点击每个用户对应的按钮时,它会重定向到另一个页面并显示
我想在没有任何框架的情况下直接在 JS 中编辑一个 SVG 文件。 基本上我有一个 SVG 主文件,其中应该包含一些子 SVG。 我已经在 Ajax 中检索了这些子项的内容,但我想将它们插入到 SVG
我有我的 ViewModel,我有我的 Controller 可以从 ViewModel 正确显示,但是我不确定如何使 ViewModel 可编辑,以便将编辑后的数据发送回模型。我只想编辑 Order
我不确定我的做法是否正确。 IplImage *dog_1 = cvCreateImage(cvGetSize(oriImg), oriImg->depth, oriImg->nChannels);
我有一个创建二维码的网络服务器。在此过程中,我得到一个 BarcodeQRCode 对象,我可以从中获取图像 (.getImage())。 我不确定如何将这张图片发回给客户。我不想将它保存在文件中,而
已编辑:我的第一个问题解决了,但又出现了另一个问题,只提供了一个用户 ID。这是修改后的代码的屏幕截图。 回到表格,用户将按下编辑按钮,这样他就可以编辑问题并给出适当的操作.. 我的上表代码是这样的:
据我了解,我无法通过重新启动服务器来清除 MySQL 查询缓存。 每次运行 sql 时,我都试图获得与第一个代码块类似的结果 1-这是在重新启动 Apache 和 MySQL 之前(第一次使用这些查询
我正在创建一个页面来搜索项目,然后能够编辑/更新它。当它只返回一个结果时我能够做到这一点,但当它给我多个结果时我只能编辑最后一项。下面是我的代码: ....... $dj =$_POST[djnum]
我是一名优秀的程序员,十分优秀!