У меня есть таблица базы данных со словами из словаря.
Теперь я хочу выбрать слова для анаграммы. Например, если я даю строку SEPIAN
она должна SEPIAN
значения, такие как apes
, pain
, pains
, pies
, pines
, sepia
и т. Д.
Для этого я использовал запрос
SELECT * FROM words WHERE word REGEXP '^[SEPIAN]{1,6}$'
Но этот запрос возвращает такие слова, как anna
, essen
которые имеют повторяющиеся символы не в прилагаемой строке. Например. anna
имеет два n
, но в строке поиска SEPIAN
есть только одно n
.
Как я могу написать свое регулярное выражение для достижения этого? Кроме того, если в моей строке поиска повторяются повторяющиеся символы, повторяющиеся символы должны отражать результат.
Поскольку MySQL не поддерживает обратные ссылки на группы захвата, типичное решение (\w).*\1
не будет работать. Это означает, что любое заданное решение должно будет перечислить все возможные удвоения. Кроме того, насколько я могу судить, обратные ссылки недействительны в ожиданиях или ожиданиях, а в MySQL не поддерживаются взгляды и ожидания.
Однако вы можете разделить это на два выражения и использовать следующий запрос:
SELECT * FROM words WHERE word REGEXP '^[SEPIAN]{1,6}$' AND NOT word REGEXP 'S.*?S|E.*?E|P.*?P|I.*?I|A.*?A|N.*?N'
Не очень красиво, но оно работает, и оно должно быть достаточно эффективным.
Чтобы поддерживать заданный предел повторяющихся символов, используйте следующий шаблон для вашего вторичного выражения:
A(.*?A){X,}
Где A
– ваш персонаж, а X
– количество раз, когда это разрешено.
Поэтому, если вы добавляете еще один N
в строку SEPIANN
(всего 2 N
с), ваш запрос будет SEPIANN
:
SELECT * FROM words WHERE word REGEXP '^[SEPIAN]{1,7}$' AND NOT word REGEXP 'S.*?S|E.*?E|P.*?P|I.*?I|A.*?A|N(.*?N){2}'
Я думаю, что-то подобное поможет вам. Табличные words
:
| id | word | alfagram | --------------------------------- | 1 | karabar | aaabkrr | | 2 | malabar | aaablmr | | 3 | trantantan| aaannnrttt|
alfagram
– это буквы слова в алфавитном порядке.
PHP-код:
$searchString = 'abrakadabra'; $searchStringAlfa = array(); for( $i=0,$c=strlen($searchString);$i<$c;$i++ ){ if( isset($searchStringAlfa[$searchString[$i]]) ){ $searchStringAlfa[$searchString[$i]]++; }else{ $searchStringAlfa[$searchString[$i]] = 1; } } ksort($searchStringAlfa); $regexp = '^'; foreach( $searchStringAlfa as $alfa=>$amount ){ $regexp .= '['.$alfa.']{0,'.$amount.'}'; } $regexp .= '$';
$searchString
– это строка, которую вы хотите найти. Тогда вам нужно только выполнить запрос:
$result = mysql_query('SELECT * FROM words WHERE alfagram REGEXP "'.$regexp.'"');
Может потребоваться дополнительная проверка и оптимизация