使用数据库中的值替换表单输入中的@tags

时间:2016-01-15 18:01:57

标签: php preg-match preg-match-all

我正在编写一个@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;}

到目前为止,这并没有输出任何合理的东西,而是它给出的只是简单的评论。 请在必要时纠正我。谢谢大家

2 个答案:

答案 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);
          }
        });
      }
    }
  });