我正在编写一个@tagging系统,其中某人在评论框中发布了一些文字,如:请@mike阅读此内容。 @paul也。然后出现注释,其中@tags替换为从包含@tags及其实际值的特定数据库中选择的值。然后评论如下:请Mike Smith阅读此内容。保罗干草也。 @tags将替换为数据库中的值。
这是我到目前为止所做的。
$comments = "Please @mike read this. @paul also";
$pattern = '/\B@[^\B]+/';
preg_match_all($pattern, $comments, $matches);
foreach ($matches[0] as $key => $value) {
$sql = "SELECT * FROM user_table WHERE tagged = '$value[$key]'";
foreach ($pdo ->query($sql) as $row){
$name = $row['name'];
$username = $row['username'];
$comments = preg_replace('/[@]+([A-Za-z0-9-_]+)/', '<a href='.$username.'>'.$name.'</a>', $comments );
}
echo $comments;}
到目前为止,这并没有输出任何合理的东西,而是它给出的只是简单的评论。 请在必要时纠正我。谢谢大家
答案 0 :(得分:0)
初始preg_match的正则表达式模式对于您正在寻找的内容是错误的。
它应该是更像这样的东西:
$pattern = '/@[a-zA-Z0-9_]+/';
然后您将拥有$matches
的以下值:
array(1) {
[0]=> array(2) {
[0]=> string(5) "@mike"
[1]=> string(5) "@paul"
}
}
所以你只需删除@
符号,除非你的用户名与它们一起存储在数据库中。你的foreach看起来更像是这样:
foreach ($matches[0] as $match) {
$match = trim($match,'@'); // remove @ sign
$sql = "SELECT * FROM user_table WHERE tagged = :username";
$results = $pdo->fetchAll($sql, ['username' => $match]);
// now run foreach on $results...
}
答案 1 :(得分:0)
试试这个
module.directive(
'myDirective',
function($compile) {
var construct = function(){
var options = [1, 2, 3];
return "<select ng-model='mychoice' ng-options='value for value in "+options+"'></select>
};
return {
restrict : 'E',
replace : true,
scope : {
data: '='
},
link : function(scope, element, attrs) {
scope.$watch('formElements', function (value) {
if(typeof value !== "undefined"){
element.html(construct());
$compile(element.contents())(scope);
}
});
}
}
});