Расстояние Левенштейна - это минимальное количество вставок, замен и удалений символов, необходимое для преобразования str1 в str2. Сложность алгоритма равна O(m*n), где n и m - длины строк str1 и str2 (неплохо по сравнению с similar_text(), имеющей сложность O(max(n,m)**3), но все же довольно много).
echo(levenshtein('abcdefg', 'amcdehg'));
$lines = [
'Продам клинок демона +6 / Солнцеликий плащ +2 тьма',
'Продам клинок демона +6, Солнцеликий плащщ +2тьма',
'Акция! Продам клинок демона +6, Солнцеликий плащ +2тьма',
'Продам клинок ангела +3, Луноликая куртка +4свет',
'Продам клинок ангелла +3, Луноликая куртка +4свет',
'Акция ! Продам клинок ангела +3, Луноликая куртка +4свет',
'тест акции',
'проверка демона',
'проверка ангела',
];
$res = [];
$allSimilar = [];
foreach ($lines as $line) {
$similarLines = [];
if(in_array($line, $allSimilar)) {
continue;
}
foreach ($lines as $line1) {
$lev = mb_levenshtein($line, $line1);
$maxDistance = (int)(0.2 * max(mb_strlen($line), mb_strlen($line1)));
if($lev <= $maxDistance) {
$similarLines[] = $line1;
$allSimilar[] = $line1;
}
}
$res[$line] = $similarLines;
}
print_r($res);
import xlsxwriter
workbook = xlsxwriter.Workbook('hello.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write('A1', 'Hello world')
workbook.close()
trait ErrorTrait
{
public function someMethod($someArg) {
echo __TRAIT__ . ": " . $someArg . "\n";
}
}
trait OtherFirstTrait
{
abstract public function someMethod($someArg);
public function someMethod1($someArg) {
echo __TRAIT__ . ": " . $someArg . "\n";
$this->someMethod($someArg);
}
}
trait OtherSecondTrait
{
abstract public function someMethod($someArg);
public function someMethod2($someArg) {
echo __TRAIT__ . ": " . $someArg . "\n";
$this->someMethod($someArg);
}
}
abstract class MainClass
{
use ErrorTrait;
}
class ChildCLass extends MainClass
{
use OtherFirstTrait, OtherSecondTrait;
}
$o = new ChildCLass();
$o->someMethod("test ErrorTrait");
print("\n");
$o->someMethod1("test OtherFirstTrait");
print("\n");
$o->someMethod2("test OtherSecondTrait");
ErrorTrait: test ErrorTrait
OtherFirstTrait: test OtherFirstTrait
ErrorTrait: test OtherFirstTrait
OtherSecondTrait: test OtherSecondTrait
ErrorTrait: test OtherSecondTrait
<link rel="stylesheet" href="/style.css?v=1">
<link rel="stylesheet" href="/style.css?v=2">
var selectors = ['black', 'white'];
$(".add-to-bag").click(function() {
var $this = $(this);
$.each(selectors, function(index, value ) {
if($('.'+value).hasClass("active")) {
console.log(value);
$this.attr("href", value+".html")
}
});
});
http://olddomain.com
на https://olddomain.com
во всех css файлах в текущей и вложенных директориях:find . -name "*.css" -exec sed -i 's|http://olddomain.com|https://olddomain.com|g' {} \;
$ip = $_SERVER['REMOTE_ADDR'];
$ipInfo = json_decode(file_get_contents("http://ip-api.com/json/{$ip}?fields=status,message,country,countryCode"), true);
if(isset($ipInfo['country']) && $ipInfo['country'] != 'Kazakhstan') {
//print('BLOCKED COUNTRY');
http_response_code(403);
die('Forbidden');
}
$(document).ready(function() {
$('a[href^="http://"], a[href^="https://"]').not('a[href*="'+document.domain+'"]').attr('target','_blank');
});
CREATE TABLE example (
id SERIAL PRIMARY KEY,
contractor_id INT NOT NULL,
is_main BOOLEAN NOT NULL,
UNIQUE (contractor_id, is_main)
);
CREATE UNIQUE INDEX CONCURRENTLY contractor_id_main ON table_name (contractor_id, is_main);
<a href="<?php echo esc_url( ( get_option( 'permalink_structure' ) ? home_url( '/menu/' ) : home_url( '/?menu' ) ) ); ?>"><?php esc_html_e( 'Menu', 'susty' ); ?></a>
<a href="<?php echo esc_url( ( get_option( 'permalink_structure' ) ? home_url( '/menu/' ) : home_url( '/?menu' ) ) ); ?>"><?php esc_html_e( 'Меню', 'susty' ); ?></a>
var o = {'0-1-211': 1, '1-1-290': 2, '2-1-380': 3};
for (var key in o) {
console.log(key.split('-')[2]);
}
var s = '{0-1-211: 1, 1-1-290: 2, 2-1-380: 3}';
s.split(',').forEach(function(v, k, arr) {
var vv = v.split(':')[0];
console.log(vv.split('-')[2]);
});
from urllib.parse import urlparse
def parse_domain(line):
scheme, netloc, path, params, query, fragment = urlparse(line)
path = path.split('/', 1)[0].strip('/')
# fix для site.com
if scheme == '' and netloc == '':
netloc = path
if scheme == '':
scheme = 'http'
# в дальнейшем может не сработать, если сайт доступен только по www и не настроен редирект с варианта без www
if netloc.startswith('www.'):
netloc = netloc[4:]
return '{}://{}'.format(scheme, netloc)
https://site.com/ -> https://site.com
www.site.com/ -> http://site.com
www.site.com -> http://site.com
site.com -> http://site.com
http://site.com -> http://site.com
site.com/test/ -> http://site.com
site/com/ -> http://site
import xlsxwriter
workbook = xlsxwriter.Workbook('hello.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write('A1', 'Hello world')
workbook.close()
$items = [
'My Tasks' => [ // уникальный ключ для каждого элемента
'text' => '130 / 500', // текст, который показывается для элемента в span
'color' => 'bg-fusion-400', // цвет
'progress_wrapper_class' => 'mb-3', // класс для progress (уникальный у User Testing) или использовать if, как в примере ниже
'progress_value' => 65, // значение progress bar
],
'Transfered' => [
'text' => '440 TB',
'color' => 'bg-success-500',
'progress_wrapper_class' => 'mb-3',
'progress_value' => 34,
],
// остальные элементы
];
<?php foreach ($items as $key => $item) : ?>
<div class="d-flex <?php if ($key == 'My Tasks'): ?>mt-2<?php endif; ?>">
<?= $key ?>
<span class="d-inline-block ml-auto"><?= $item['text'] ?></span>
</div>
<div class="progress progress-sm mb-3">
<div class="progress-bar <?= $item['color'] ?>" role="progressbar" style="width: <?= $item['progress_value'] ?>%;" aria-valuenow="<?= $item['progress_value'] ?>" aria-valuemin="0" aria-valuemax="100"></div>
</div>
<?php endforeach; ?>