У меня есть таблица базы данных со словами из словаря.
Теперь я хочу выбрать слова для анаграммы. Например, если я даю строку 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.'"');
Может потребоваться дополнительная проверка и оптимизация