私はあなたが正規表現を使用してそれを達成することができると思う唯一の方法は、最短から最長にあなたのケースでは、最初の望ましい順に単語を並べ替えることです。
単語の量が比較的少ない場合、パフォーマンスのために、単語を連結して最初の一致を同時に確認することができます。これは、PHP RegExpの実装が左から右への検索を実行するために可能です。以下の例では、関数search_short()
を参照してください。
とにかく、ループと、最低から始まる単語のチェックも同様に機能します。以下の例では、機能search_long()
を確認してください。
<?php
$given = [
'telephone',
'television',
];
// NB: Do not forget to sanitize user input, i.e. $query
echo (search_short($given, 'tele') ?: 'Nothing found') . PHP_EOL;
echo (search_long($given, 'tele') ?: 'Nothing found') . PHP_EOL;
echo (search_short($given, 't[a-zA-Z0-9]{0,2}l[a-zA-Z0-9]{0,}') ?: 'Nothing found') . PHP_EOL;
echo (search_long($given, 't[a-zA-Z0-9]{0,2}l[a-zA-Z0-9]{0,}') ?: 'Nothing found') . PHP_EOL;
/**
* @param string[] $given
* @param string $query
*
* @return null|string
*/
function search_short($given, $query)
{
// precalculating the length of each word, removing duplicates, sorting
$given = array_map(function ($word) {
return mb_strlen($word); // `mb_strlen()` is O(N) function, while `strlen()` is O(1)
}, array_combine($given, $given));
asort($given);
// preparing the index string
$index = implode(PHP_EOL, array_keys($given));
// and, finally, searching (the multiline flag is set)
preg_match(
sprintf('/^(?<word>%s\w*)$/mu', $query), // injecting the query word
$index,
$matches
);
// the final pattern looks like: "/^(?P<word>tele\w*)$/mui"
if (array_key_exists('word', $matches)) {
return $matches['word'];
}
return null;
}
/**
* @param string[] $given
* @param string $query
*
* @return null|string
*/
function search_long($given, $query)
{
$pattern = sprintf('/^(?<word>%s\w*)$/u', $query);
// precalculating the length of each word, removing duplicates, sorting
$given = array_map(function ($word) {
return mb_strlen($word);
}, array_combine($given, $given));
asort($given);
foreach ($given as $word => $count) {
if (preg_match($pattern, $word, $matches)) {
if (array_key_exists('word', $matches)) {
return $matches['word'];
}
}
}
return false;
}
もちろん、これは最も効率的なアルゴリズムではなく、複数の方法で改善される可能性があります。しかし、これを達成するために必要な範囲と使用法についての詳細情報。
出典
2017-02-20 21:25:27
woo
正規表現では、これを単独で行うことはできません。すべてのマッチを正規表現で見つけ出し、長さで並べ替えて最初のものを表示する必要があります。 – Barmar
検索するものや方法などのコードが必要になることがあります。 – AbraCadaver