Improve mention matches

The previous regex didn't correctly match users with . ' or -

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2021-01-29 09:46:14 +01:00 committed by backportbot[bot]
parent 1afa136060
commit 8e43331d47
3 changed files with 9 additions and 10 deletions

View File

@ -213,17 +213,11 @@ class Provider implements IProvider {
continue;
}
$pattern = '/(^|\s)(' . '@' . $mention['id'] . ')(\b)/';
if (strpos($mention['id'], ' ') !== false) {
$pattern = '/(^|\s)(' . '@"' . $mention['id'] . '"' . ')(\b)?/';
$message = str_replace('@"' . $mention['id'] . '"', '{mention' . $mentionCount . '}', $message);
if (strpos($mention['id'], ' ') === false && strpos($mention['id'], 'guest/') !== 0) {
$message = str_replace('@' . $mention['id'], '{mention' . $mentionCount . '}', $message);
}
$message = preg_replace(
$pattern,
//'${1}' . $this->regexSafeUser($mention['id'], $displayName) . '${3}',
'${1}' . '{mention' . $mentionCount . '}' . '${3}',
$message
);
$mentions['mention' . $mentionCount] = $this->generateUserParameter($mention['id']);
$mentionCount++;
}

View File

@ -195,7 +195,11 @@ class Notifier implements INotifier {
// could contain characters like '@' for user IDs) but a one-based
// index of the mentions of that type.
$mentionParameterId = 'mention-' . $mention['type'] . $mentionTypeCount[$mention['type']];
$message = str_replace('@' . $mention['id'], '{' . $mentionParameterId . '}', $message);
$message = str_replace('@"' . $mention['id'] . '"', '{' . $mentionParameterId . '}', $message);
if (strpos($mention['id'], ' ') === false && strpos($mention['id'], 'guest/') !== 0) {
$message = str_replace('@' . $mention['id'], '{' . $mentionParameterId . '}', $message);
}
try {
$displayName = $this->commentsManager->resolveDisplayName($mention['type'], $mention['id']);
} catch (\OutOfBoundsException $e) {

View File

@ -233,6 +233,7 @@ class Comment implements IComment {
return [];
}
$uids = array_unique($mentions[0]);
usort($uids, 'mb_strlen');
$result = [];
foreach ($uids as $uid) {
$cleanUid = trim(substr($uid, 1), '"');