Expression régulière pour rechercher du texte entre les virgules
Je vais noix essayant d'obtenir une expression régulière pour détecter le spam de mots-clés dans les entrées de l'utilisateur. Habituellement, il ya peu de texte normal au début et le mot-clé le spam à la fin, séparés par des virgules ou autres caractères.
Ce dont j'ai besoin est une expression régulière pour compter le nombre de mots-clés pour marquer le texte pour un homme de le vérifier.
Le texte est généralement comme ceci:
[random text, with commas, dots and all]
keyword1, keyword2, keyword3, keyword4, keyword5,
Keyword6, keyword7, keyword8...
J'ai essayé plusieurs regex pour compter les matches:
-Ce n'obtient que l'un des deux mots clés
[,-](\w|\s)+[,-]
-Ce qui correspond également au texte aléatoire
(?:([^,-]*)(?:[^,-]|$))
Quelqu'un peut me dire une regex pour ce faire? Ou je devrais prendre une approche différente?
Merci!
Est une autre façon de formuler votre question "Comment puis-je compter le nombre de comas il y a sur la dernière ligne de texte?" ?
Modifié la question pour la rendre plus claire l'exemple
Le problème n'est pas l'expression rationnelle. Le problème, c'est que vous n'avez pas formulé d'une façon dont la chaîne de mots-clés sont différents à partir du corps du texte. Jusqu'à ce que vous avez lu, vous ne serez pas en mesure de former un véritable regexp. Donc, avec cela à l'esprit, s'il y a des espaces dans les mots clés? C'est à dire peut "Expression Régulière" être un mot-clé?
La différence est que les mots clés sont toujours ENTRE les virgules, des points ou des séparateurs comme cela, ce serait de me donner des faux positifs dans le texte aléatoire, mais pas trop.
OriginalL'auteur SkarXa | 2013-10-22
Vous devez vous connecter pour publier un commentaire.
Je pense que la difficulté est que le texte aléatoire peut également contenir des virgules.
Si les mots clés sont sur une seule ligne et c'est la dernière ligne de l'ensemble du texte, de l'assiette de l'ensemble du texte supprimant les caractères de nouvelle ligne à partir de la fin. Puis prendre le texte à partir du dernier caractère de nouvelle ligne à la fin. Ce doit être votre chaîne de caractères contenant les mots clés. Une fois que vous avez cette partie montrés du doigt, vous pouvez faire exploser la chaîne de virgule et de compter les pièces.
Je sais que ce n'est pas une regex, mais j'espère que cela aide tout de même.
La seule façon de trouver une solution, c'est de trouver quelque chose qui sépare le texte aléatoire et les mots clés qui n'est pas présent dans les mots clés. Si une nouvelle ligne est présente dans les mots clés, vous ne pouvez pas l'utiliser. Mais 2 consécutifs de nouvelles lignes? Ou n'importe quel autre caractère.
(edit: ajout de l'exemple pour plus de nouvelles lignes long de la prise de vue)
Alors c'est assez dur à faire, sauf si vous savez de la façon dont les mots clés sont séparés du texte aléatoire (même si c'est par 2, en fin de ligne, alors vous pouvez l'utiliser comme un point de départ
J'ai mis à jour ma réponse avec un double séparateur de ligne n'est pas présent dans les mots clés. si c'est pas OK, j'abandonne. 🙂 vous avez besoin d'un séparateur pour séparer entre les 2
Je profite de cette approche et d'essayer de diviser le texte normal à partir de mots-clés TY.
cool, pouvez-vous accepter la réponse (case située à côté de la poste). Bonne chance à la faire fonctionner!
OriginalL'auteur Jeroen
Pr votre réponse à ma question, ici, est une regexp pour correspondre à une chaîne qui se produit entre deux virgules.
Cette regexp ne correspond pas, et donc ne consomment pas, la délimitation des virgules.
Cette regexp pourrait correspondre à " et donc ne consomment pas de" dans la phrase précédente.
Le fait que la regexp appariés et consommé les virgules est la raison pour laquelle votre tentative de regexp n'a d'égale que tous les autres candidats.
Également si la totalité de l'entrée est une simple chaîne de caractères que vous voulez l'empêcher mais les sauts de ligne. Dans ce cas, vous souhaitez utiliser;
http://www.phpliveregex.com/p/1DJ
Désolé, manque de cardinalité. Est fixé maintenant.
OriginalL'auteur Taemyr
Comme d'autres l'ont dit, c'est potentiellement un très chose la plus délicate à faire... Il souffre tout de même les échecs comme général "mot de filtrage" (par exemple, les gens seront "masque" de l'entrée). Il est rendu encore plus difficile sans beaucoup d'exemples de messages pour tester contre...
Solution
De toute façon, en supposant que les mots clés seront sur des lignes séparées du reste de l'entrée et séparés par des virgules, vous pouvez faire correspondre les lignes avec des mots clés comme:
Regex
D'entrée
Prises à partir de votre question ci-dessus:
De sortie
Explication
#
=> Départ délimiteur(?:^)
=> les Matchs de début de ligne dans un non-la capture d'un groupe (vous pouvez simplement utiliser^
j'ai été en utilisant|\n
à l'origine et n'a pas de mise à jour)(
=> Démarrer une capture d'un groupe(?:
=> Démarrer une non-capture d'un groupe(?:[\w]+)
=> Un non-capture d'un groupe de correspondance un ou plusieurs caractères de mota-zA-Z0-9_
(à l'Aide d'une classe de caractères, de sorte que vous pouvez y ajouter si vous en avez besoin....)(?:, ?|$)
=> Un non-capture d'un groupe pour le match soit une virgule (en option avec un espace) ou à la fin de la chaîne de caractères/ligne)+
=> Fin de la non-capture de groupe (4) et répétez les 5/6 de trouver des correspondances multiples dans la ligne)
=> Fermer le groupe de capture 3#
=> séparateur Finm
=> Multi-ligne modificateurSuivi du numéro 2:
Comptage des mots-clés
Après avoir retourné un tableau de lignes seulement contenant des mots clés, vous pouvez compter le nombre de virgules et d'obtenir ainsi le nombre de mots-clés
N. B. Dans la plupart des cas, cette situation sera de retour
NUMBER_OF_KEY_WORDS - 1
(c'est à dire dans votre cas 7); elle renvoie8
parce que vous avez une virgule à la fin de votre première ligne de mots-clés.Liens
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
http://www.regular-expressions.info/
http://php.net/substr_count
OriginalL'auteur Steven
Votre premier regexp n'a pas besoin d'un précédent virgule
Désolé. J'ai oublié aléatoire de texte. ^(\s*[\w_-]+\s*(?:[,-]|$))+
OriginalL'auteur MC ND
Pourquoi ne pas simplement utiliser exploser et garniture?
Puis faire un count() sur $mots-clés.
Si vous pensez que les mots clés avec des espaces sont du spam, vous pouvez effectuer une itération de l' $mots-clés tableau et de regarder pour tout contenir d'espaces. Il pourrait y avoir des raisons légitimes d'avoir des espaces dans un mot-clé. Si vous parlez des super-héros sur votre système, par exemple, quelqu'un pourrait entrer
The Tick
ouIron Man
en tant que mot cléJe ne pense pas que le comptage de mots clés et la recherche d'espaces dans les mots clés sont vraiment de très bonnes stratégies pour la détection de spam. Vous voudrez peut-être regarder en bot d'autres stratégies de protection au lieu de cela, ou même utiliser le manuel de la modération.
Sans savoir quel est le texte aléatoire est qu'il y a peu d'espoir d'être capable d'écrire un fiable système de détection automatique. Si c'est un gros problème, vous devrez peut-être appuyer sur un CAPTCHA ou même manuel de modération.
OriginalL'auteur GordonM