Antispam improvements#2285
Conversation
WalkthroughThis update introduces a comprehensive overhaul of the spam prevention system. It adds new controller and model classes for centralized and extensible spam detection, including denylist and StopForumSpam integration. The honeypot mechanism is refactored for improved hiding and dynamic field handling. Related settings, views, tests, and static denylist data files are updated or added to support these features. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant Form
participant FrmAntiSpamController
participant FrmSpamCheckDenylist
participant FrmSpamCheckWPDisallowedWords
participant FrmSpamCheckStopForumSpam
participant FrmSpamCheckUseWPComments
User->>Form: Submit entry
Form->>FrmAntiSpamController: is_spam(values)
FrmAntiSpamController->>FrmSpamCheckWPDisallowedWords: is_spam(values)
alt Disallowed words detected
FrmSpamCheckWPDisallowedWords-->>FrmAntiSpamController: spam message
FrmAntiSpamController-->>Form: spam message
else No disallowed words
FrmAntiSpamController->>FrmSpamCheckDenylist: is_spam(values)
alt Denylist match
FrmSpamCheckDenylist-->>FrmAntiSpamController: spam message
FrmAntiSpamController-->>Form: spam message
else No denylist match
FrmAntiSpamController->>FrmSpamCheckStopForumSpam: is_spam(values)
alt StopForumSpam match
FrmSpamCheckStopForumSpam-->>FrmAntiSpamController: spam message
FrmAntiSpamController-->>Form: spam message
else No StopForumSpam match
FrmAntiSpamController->>FrmSpamCheckUseWPComments: is_spam(values)
alt WP Comments match
FrmSpamCheckUseWPComments-->>FrmAntiSpamController: spam message
FrmAntiSpamController-->>Form: spam message
else No spam detected
FrmAntiSpamController-->>Form: false
end
end
end
end
Form-->>User: Show result (spam message or success)
Suggested labels
Suggested reviewers
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 17
🧹 Nitpick comments (16)
classes/models/FrmSpamCheck.php (2)
11-13: Remove commented-out debugging code.There's a commented-out
error_logstatement that should be removed. Leaving debugging code in production, even if commented out, can lead to confusion for other developers.- $this->posted_fields = FrmField::get_all_for_form( $values['form_id'] ); -// error_log( print_r( $this->posted_fields, true ) ); + $this->posted_fields = FrmField::get_all_for_form( $values['form_id'] );
34-48: Add documentation for placeholder methods.These placeholder methods lack documentation explaining their purpose and expected implementation by subclasses. Consider adding PHPDoc blocks to clarify their intended use, return values, and parameters (if any).
For example:
+ /** + * Check if any of the submitted values contain spam words. + * + * @return bool True if spam words are found. + */ protected function check_whole_values_contain_spam_words() { }classes/views/frm-settings/captcha/captcha.php (2)
117-122: Consider adding a tooltip explaining WordPress spam comments check.While the option label is clear, users might benefit from a tooltip explaining how WordPress spam comments data is used for detection, similar to what you've done with the honeypot option.
<label for="frm-wp-spam-check"> <input type="checkbox" id="frm-wp-spam-check" name="frm_wp_spam_check" value="1" <?php checked( $frm_settings->wp_spam_check, 1 ); ?> /> <?php esc_html_e( 'Use WordPress spam comments to check entries for spam', 'formidable' ); ?> + <?php FrmAppHelper::tooltip_icon( __( 'This will check submission data against WordPress comment spam history to identify known spammers by their IP address, email, or URL.', 'formidable' ), array( 'data-container' => 'body' ) ); ?> </label>
132-138: Consider adding examples in tooltip for whitelist/blacklist format.The current tooltip mentions "Each word or regex is on one line" but users might benefit from examples of valid entries.
<label for="frm-whitelist"> <?php esc_html_e( 'Custom whitelist words', 'formidable' ); ?> - <?php FrmAppHelper::tooltip_icon( __( 'Each word or regex is on one line.', 'formidable' ), array( 'data-container' => 'body' ) ); ?> + <?php FrmAppHelper::tooltip_icon( __( 'Each word or regex is on one line. Examples: spam-word, /pattern\d+/, domain\.com', 'formidable' ), array( 'data-container' => 'body' ) ); ?> </label> <textarea id="frm-whitelist" name="frm_whitelist"><?php echo esc_textarea( $frm_settings->whitelist ); ?></textarea>classes/models/FrmSpamCheckUseWPComments.php (1)
15-19: Consider case-insensitive email matching.Email comparisons are currently case-sensitive, but email addresses are typically case-insensitive. This could allow spammers to bypass detection by changing the case of an email.
foreach ( $item_meta as $value ) { - if ( $value === $comment->comment_author_email || $value === $comment->comment_author_url ) { + // Email addresses should be compared case-insensitively + if ( + ( is_string($value) && strtolower($value) === strtolower($comment->comment_author_email) ) || + $value === $comment->comment_author_url + ) { return true; } }classes/models/FrmSpamCheckStopforumspam.php (1)
47-49: Brittle XML parsing – use a proper parserRelying on two
strpos()checks will miss results if the XML changes order/whitespace.
Parsing withsimplexml_load_string()(already bundled with PHP) is safer and only a few lines.classes/controllers/FrmAntiSpamController.php (1)
56-59: Super‑fluousisset()– simplify (Psalm notice)
preg_match_all()always sets index 0, soisset()is redundant.- return isset( $matches[0] ) ? $matches[0] : array(); + return $matches[0];🧰 Tools
🪛 GitHub Check: PHPStan
[failure] 59-59:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.classes/models/FrmSpamCheckBlacklist.php (1)
50-58:get_blacklist_ip()– return structure diverges from consumerConsumers expect
'files'and'custom'keys. Good.
Add a filter hook (frm_blacklist_ip) now (marked TODO) to let site owners extend/override without editing the plugin.classes/models/FrmBlacklistSpamCheck.php (1)
61-97: Heavy file I/O on every submission
Opening and iterating large blacklist files on every request will hurt performance under load. Consider:
- Caching parsed files in a static property or a transient.
- Using
SplFileObjectwithsetFlags( SPL_FILE_OBJECT_SKIP_EMPTY )to avoid manual trimming.This is optional but will noticeably reduce CPU and disk reads on busy sites.
classes/models/FrmStopforumspam.php (2)
70-73: Simplifypreg_match_allresult handling & tighten regex
preg_match_all()always creates$matches[0]; theisset()guard is redundant and PHPStan flags it. Also, the pattern can be made more robust.- preg_match_all( '/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $str, $matches ); - return isset( $matches[0] ) ? $matches[0] : array(); + preg_match_all( '/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i', $str, $matches ); + return $matches[0];🧰 Tools
🪛 GitHub Check: PHPStan
[failure] 72-72:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.
75-81: Dead code:add_email_to_request()is never called
The helper duplicates work already done byextract_emails_from_string()and can be safely removed to reduce maintenance overhead.classes/models/FrmEntryValidate.php (3)
38-51: Avoid duplicate DB query by passing$posted_fields
$posted_fieldsis already calculated a few lines above; forwarding it prevents an extraget_fields_to_validate()call insidespam_check().- self::spam_check( $exclude, $values, $errors ); + self::spam_check( $exclude, $values, $errors, $posted_fields );
442-442: Extraneous semicolon
Double semicolons are harmless but noisy.- $check = new FrmBlacklistSpamCheck( $values['form_id'] );; + $check = new FrmBlacklistSpamCheck( $values['form_id'] );
385-410: Unused helper methods can be removed
is_stopforumspam_spam()andis_wp_comment_spam()are no longer referenced now thatFrmAntiSpamControllercentralises the checks. Removing them will cut dead code and lower cognitive load.🧰 Tools
🪛 GitHub Check: Psalm
[failure] 397-397: PossiblyInvalidIterator
classes/models/FrmEntryValidate.php:397:13: PossiblyInvalidIterator: Cannot iterate over int (see https://psalm.dev/165)classes/models/FrmHoneypot.php (2)
199-212: Minor: unneeded array walk and double sanitisation
get_honeypot_field_value()pulls the entireitem_metaarray from the request, only to access one index.
If the request payload is large, this copies more data than necessary.
Since the value is never echoed without escaping, applyingsanitize_text_fieldhere as well would harden against edge‑case injection when other hooks inspect$this->fields.- return isset( $item_meta[ $field_id ] ) ? $item_meta[ $field_id ] : ''; + return isset( $item_meta[ $field_id ] ) ? sanitize_text_field( $item_meta[ $field_id ] ) : '';This is a low‑impact nitpick; feel free to skip if the parent validator already sanitises.
27-30:is_enabled()could be in the parent or removedThe private static
is_enabled()is only used bymaybe_print_honeypot_js().
If the parent already exposesis_option_on()(instance) or similar logic, consider reusing it instead of duplicating the “read settings → return flag” pattern.Not blocking, but centralising the “is honeypot active?” check reduces future divergence.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (24)
blacklist/domain-partial.txt(1 hunks)blacklist/ip.txt(1 hunks)classes/controllers/FrmAntiSpamController.php(1 hunks)classes/controllers/FrmFormsController.php(2 hunks)classes/controllers/FrmSettingsController.php(1 hunks)classes/helpers/FrmAppHelper.php(1 hunks)classes/helpers/FrmFormsHelper.php(1 hunks)classes/models/FrmBlacklistSpamCheck.php(1 hunks)classes/models/FrmEntryValidate.php(5 hunks)classes/models/FrmHoneypot.php(4 hunks)classes/models/FrmSettings.php(3 hunks)classes/models/FrmSpamCheck.php(1 hunks)classes/models/FrmSpamCheckBlacklist.php(1 hunks)classes/models/FrmSpamCheckStopforumspam.php(1 hunks)classes/models/FrmSpamCheckUseWPComments.php(1 hunks)classes/models/FrmSpamCheckWPDisallowedWords.php(1 hunks)classes/models/FrmStopforumspam.php(1 hunks)classes/models/FrmUsage.php(2 hunks)classes/models/FrmValidate.php(2 hunks)classes/views/frm-entries/form.php(0 hunks)classes/views/frm-entries/new.php(1 hunks)classes/views/frm-forms/spam-settings/stopforumspam.php(1 hunks)classes/views/frm-settings/captcha/captcha.php(1 hunks)css/custom_theme.css.php(0 hunks)
💤 Files with no reviewable changes (2)
- classes/views/frm-entries/form.php
- css/custom_theme.css.php
🧰 Additional context used
🧬 Code Graph Analysis (9)
classes/views/frm-entries/new.php (1)
classes/controllers/FrmFormsController.php (1)
message_placement(2976-2992)
classes/controllers/FrmFormsController.php (2)
classes/helpers/FrmAppHelper.php (3)
FrmAppHelper(6-4462)plugin_path(58-60)is_admin(454-462)classes/models/FrmHoneypot.php (2)
FrmHoneypot(6-244)maybe_print_honeypot_js(101-127)
classes/models/FrmSpamCheck.php (1)
classes/models/FrmField.php (2)
FrmField(6-1501)get_all_for_form(889-928)
classes/controllers/FrmAntiSpamController.php (5)
classes/models/FrmSpamCheckStopforumspam.php (2)
FrmSpamCheckStopforumspam(3-50)check(5-29)classes/models/FrmSpamCheckUseWPComments.php (2)
FrmSpamCheckUseWPComments(3-29)check(5-23)classes/models/FrmSpamCheckWPDisallowedWords.php (2)
FrmSpamCheckWPDisallowedWords(3-53)check(5-20)classes/models/FrmBlacklistSpamCheck.php (1)
FrmBlacklistSpamCheck(3-176)classes/helpers/FrmAppHelper.php (2)
FrmAppHelper(6-4462)maybe_json_encode(3278-3283)
classes/models/FrmStopforumspam.php (2)
classes/models/FrmValidate.php (5)
FrmValidate(6-66)get_option_key(65-65)validate(58-58)is_option_on(44-53)get_form(34-39)classes/helpers/FrmAppHelper.php (2)
FrmAppHelper(6-4462)get_ip_address(526-547)
classes/models/FrmSpamCheckBlacklist.php (6)
classes/models/FrmSpamCheck.php (5)
FrmSpamCheck(3-49)__construct(9-13)is_enabled(30-32)check(28-28)is_spam(15-21)classes/models/FrmSpamCheckWPDisallowedWords.php (2)
is_enabled(50-52)check(5-20)classes/models/FrmSpamCheckStopforumspam.php (2)
is_enabled(31-34)check(5-29)classes/models/FrmSpamCheckUseWPComments.php (2)
is_enabled(25-28)check(5-23)classes/helpers/FrmAppHelper.php (3)
FrmAppHelper(6-4462)maybe_json_encode(3278-3283)get_ip_address(526-547)classes/controllers/FrmAntiSpamController.php (3)
is_spam(13-18)FrmAntiSpamController(3-70)get_whitelist_ip(67-69)
classes/models/FrmValidate.php (3)
classes/models/FrmStopforumspam.php (1)
get_option_key(9-11)classes/models/FrmHoneypot.php (1)
get_option_key(23-25)classes/helpers/FrmAppHelper.php (1)
FrmAppHelper(6-4462)
classes/views/frm-settings/captcha/captcha.php (1)
classes/helpers/FrmAppHelper.php (4)
checked(2089-2093)FrmAppHelper(6-4462)tooltip_icon(4388-4400)esc_textarea(2186-2198)
classes/models/FrmEntryValidate.php (5)
classes/controllers/FrmAntiSpamController.php (5)
FrmAntiSpamController(3-70)get_spam_message(46-48)is_spam(13-18)is_stopforumspam_spam(20-23)is_wp_comment_spam(25-28)classes/models/FrmStopforumspam.php (5)
is_spam(33-57)FrmStopforumspam(3-86)set_values(20-22)set_posted_fields(24-26)validate(13-18)classes/models/FrmBlacklistSpamCheck.php (3)
set_values(7-9)validate(44-100)FrmBlacklistSpamCheck(3-176)classes/helpers/FrmAppHelper.php (3)
FrmAppHelper(6-4462)get_ip_address(526-547)array_flatten(2152-2165)classes/models/FrmSpamCheckUseWPComments.php (1)
check(5-23)
🪛 GitHub Check: Psalm
classes/models/FrmSpamCheckUseWPComments.php
[failure] 10-10: PossiblyInvalidIterator
classes/models/FrmSpamCheckUseWPComments.php:10:13: PossiblyInvalidIterator: Cannot iterate over int (see https://psalm.dev/165)
classes/models/FrmSpamCheckStopforumspam.php
[failure] 20-20: UndefinedMethod
classes/models/FrmSpamCheckStopforumspam.php:20:13: UndefinedMethod: Method FrmAntiSpamController::extract_emails_from_string does not exist (see https://psalm.dev/022)
classes/controllers/FrmAntiSpamController.php
[failure] 21-21: TooManyArguments
classes/controllers/FrmAntiSpamController.php:21:17: TooManyArguments: Too many arguments for FrmSpamCheckStopforumspam::__construct - expecting 1 but saw 2 (see https://psalm.dev/026)
[failure] 26-26: TooManyArguments
classes/controllers/FrmAntiSpamController.php:26:17: TooManyArguments: Too many arguments for FrmSpamCheckUseWPComments::__construct - expecting 1 but saw 2 (see https://psalm.dev/026)
[failure] 31-31: TooManyArguments
classes/controllers/FrmAntiSpamController.php:31:17: TooManyArguments: Too many arguments for FrmSpamCheckWPDisallowedWords::__construct - expecting 1 but saw 2 (see https://psalm.dev/026)
classes/models/FrmSpamCheckBlacklist.php
[failure] 18-18: TooManyArguments
classes/models/FrmSpamCheckBlacklist.php:18:3: TooManyArguments: Too many arguments for FrmSpamCheck::__construct - expecting 1 but saw 2 (see https://psalm.dev/026)
classes/models/FrmBlacklistSpamCheck.php
[failure] 129-129: DeprecatedFunction
classes/models/FrmBlacklistSpamCheck.php:129:10: DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)
classes/models/FrmEntryValidate.php
[failure] 317-317: InvalidParamDefault
classes/models/FrmEntryValidate.php:317:12: InvalidParamDefault: Default value type false for argument 4 of method FrmEntryValidate::spam_check does not match the given type array<array-key, mixed> (see https://psalm.dev/062)
[failure] 397-397: PossiblyInvalidIterator
classes/models/FrmEntryValidate.php:397:13: PossiblyInvalidIterator: Cannot iterate over int (see https://psalm.dev/165)
classes/models/FrmSpamCheckWPDisallowedWords.php
[failure] 47-47: DeprecatedFunction
classes/models/FrmSpamCheckWPDisallowedWords.php:47:10: DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)
🪛 GitHub Check: PHPStan
classes/models/FrmSpamCheckStopforumspam.php
[failure] 20-20:
Call to an undefined static method FrmAntiSpamController::extract_emails_from_string().
classes/controllers/FrmAntiSpamController.php
[failure] 21-21:
Class FrmSpamCheckStopforumspam constructor invoked with 2 parameters, 1 required.
[failure] 26-26:
Class FrmSpamCheckUseWPComments constructor invoked with 2 parameters, 1 required.
[failure] 31-31:
Class FrmSpamCheckWPDisallowedWords constructor invoked with 2 parameters, 1 required.
[failure] 59-59:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.
classes/models/FrmStopforumspam.php
[failure] 72-72:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.
classes/models/FrmSpamCheckBlacklist.php
[failure] 18-18:
Method FrmSpamCheck::__construct() invoked with 2 parameters, 1 required.
classes/models/FrmEntryValidate.php
[failure] 319-319:
Default value of the parameter #4 $posted_fields (false) of method FrmEntryValidate::spam_check() is incompatible with type array.
🪛 GitHub Actions: Psalm Code Analysis
classes/controllers/FrmAntiSpamController.php
[error] 21-21: Psalm: Too many arguments for FrmSpamCheckStopforumspam::__construct - expecting 1 but saw 2 (see https://psalm.dev/026)
🪛 LanguageTool
blacklist/domain-partial.txt
[typographical] ~19-~19: Twee of meer opeenvolgende punten; 1 of 3 is gebruikelijk.
Context: ...ine.info -spin -tw.biz -tw.info -tw.org ..mediabey.com .00860.net .0amail.top .0px...
(DOUBLE_PUNCTUATION)
[misspelling] ~28-~28: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...om .101livemail.top .10mail.org .10mail.tk .1146.info .163.com.com .1900.io .1amai...
(NL_SIMPLE_REPLACE_TK)
[style] ~35-~35: Netter is om het uit te schrijven.
Context: ....1bayandiyarbakiresc.xyz .1website.net .1x.biz .2012moviedownloadfree.com .24space...
(_10X)
[style] ~59-~59: Netter is om het uit te schrijven.
Context: ... .8358699.com .86kk.net .882113322.com .8x.biz .9227xpj.com .92gmail.com .992459.c...
(_10X)
[uncategorized] ~84-~84: Juist is: “eens”.
Context: ...waw.pl .akk.ro .aktifbil.com .alcaldede.es .alexander-skarsgard.net .alexhaleighga...
(KIJK_ES_PREMIUM)
[misspelling] ~327-~327: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...msq0.com .cn.pn .co.at.pn .co.cc .co.kr.iki.kr .co.kr.lbe.kr .co.uk.pn .coarco.com....
(NL_SIMPLE_REPLACE_IKI)
[misspelling] ~347-~347: ‘config’ zou fout kunnen zijn. Misschien bedoelt u: “configuratie”
Context: ...iting.com .comrugvvokrug.ru .conf.work .config.work .consored.com .construtrabajo.com ...
(NL_SIMPLE_REPLACE_CONFIG)
[misspelling] ~514-~514: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...xpertadvisormt4ea.com .externalizare-it.pw .extra-breast.info .extra-penis-enlarge...
(NL_SIMPLE_REPLACE_PW)
[misspelling] ~640-~640: Gram hoort afgekort te worden als ‘g’, groeten kun je beter voluit schrijven.
Context: ...ts.top .goverloe.com .gowactivator.com .gr.vu .gr8domain.biz .grammi.sg .green-cof...
(NL_SIMPLE_REPLACE_GR)
[misspelling] ~653-~653: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ineranker.online .gsasearchengineranker.pw .gsasearchengineranker.site .gsasearche...
(NL_SIMPLE_REPLACE_PW)
[style] ~660-~660: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...xyz .gsasearchenginerankerdiscount.com .gsasearchenginerankersocialser.com .gsaserlist.com .gsaverifiedlist.do...
(ERG_LANG_WOORD)
[misspelling] ~729-~729: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...giveaways.xyz .ihappytime.com .ihc.xyz .iki.kr .ilink.website .ilyushu.com .imagens...
(NL_SIMPLE_REPLACE_IKI)
[uncategorized] ~929-~929: Dit lijkt niet correct te zijn.
Context: ....makingdomes.com .maleenhancement.club .malsers.com .manidn.com .mantly.com .mantul.xyz...
(IETS_KLEINS)
[misspelling] ~1022-~1022: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...waw.pl .neonfringe.com .nesine.fun .net.iki.kr .netbreeze.site .netmail.tk .newfish...
(NL_SIMPLE_REPLACE_IKI)
[misspelling] ~1024-~1024: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...un .net.iki.kr .netbreeze.site .netmail.tk .newfishingaccessories.com .newpopularw...
(NL_SIMPLE_REPLACE_TK)
[misspelling] ~1148-~1148: ‘pp’ zou fout kunnen zijn. Misschien bedoelt u: “p.p.”
Context: ....powds.com .poy.kr .pozycjonowanie8.pl .pp.ua .ppc-e.com .ppoet.com .prclosing.inf...
(NL_SIMPLE_REPLACE_PP)
[misspelling] ~1169-~1169: ‘pp’ zou fout kunnen zijn. Misschien bedoelt u: “p.p.”
Context: ...esde.com .prowebmail.online .pryaniki68.pp.ru .ps4.rocks .ptmm.com .publicidadedig...
(NL_SIMPLE_REPLACE_PP)
[misspelling] ~1190-~1190: Verwacht werd “voorbedachten rade”, “te rade” of mogelijk “raden”.
Context: ...uickmail.pl .quixyl.com .qwertylock.com .rade.waw.pl .radi6.com .radities.com .ragnor...
(VOORBEDACHTEN_RADE)
[style] ~1314-~1314: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...n.com .snz873.com .socialrpmailing.com .socialsergsasearchengineranker.com .softhandscream.com .softtoiletpape...
(ERG_LANG_WOORD)
[misspelling] ~1405-~1405: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...m .toshikokaori.xyz .totozyn.com .tpost.pw .tr.vu .tradingcogroup.ir .traduzioni-i...
(NL_SIMPLE_REPLACE_PW)
[misspelling] ~1414-~1414: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ellerapp.click .trendesmail.com .tricks.pw .trillania.com .trinityanokamn.org .tru...
(NL_SIMPLE_REPLACE_PW)
[misspelling] ~1526-~1526: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ilm1.site .webmailmeta.site .webmailpro.pw .webolowitz.com .webproton.site .webvan...
(NL_SIMPLE_REPLACE_PW)
[misspelling] ~1586-~1586: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ....yandexx.info .yankeeroo.com .yertxenor.tk .yffk.xyz .ylfpay.cn .ylixo.com .yohana...
(NL_SIMPLE_REPLACE_TK)
[uncategorized] ~1623-~1623: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...electricscooter.com 1bayandiyarbakiresc.xyz 1win- 1xbet- 2012-2016.ru 2018.top 21ja...
(PUNT_GEEN_HL)
[uncategorized] ~1628-~1628: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...in- 1xbet- 2012-2016.ru 2018.top 21jack.club 24hstyle.shop 2605mails 26forex 2escort...
(PUNT_GEEN_HL)
[uncategorized] ~1629-~1629: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...2-2016.ru 2018.top 21jack.club 24hstyle.shop 2605mails 26forex 2escortdiyarbakir2.xy...
(PUNT_GEEN_HL)
[uncategorized] ~1635-~1635: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... 360ezzz.com 389production.com 4evrmail.shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz ...
(PUNT_GEEN_HL)
[uncategorized] ~1636-~1636: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... 389production.com 4evrmail.shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.bu...
(PUNT_GEEN_HL)
[uncategorized] ~1639-~1639: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.buzz a4ktube.com acceder-dispo...
(PUNT_GEEN_HL)
[uncategorized] ~1640-~1640: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...yz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.buzz a4ktube.com acceder-dispositivonovob.co...
(PUNT_GEEN_HL)
[uncategorized] ~1650-~1650: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... affordablespecs.online ago12z7v9lo9a0f.lol air-max air-maxs airj0 airjordan airjor...
(PUNT_GEEN_HL)
[style] ~1661-~1661: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...allmail.gdn alxmedia.online amoriza.net angelamcreynoldsrealestateagentedmondok.com angelamcreynoldsrealestateagentokla...
(ERG_LANG_WOORD)
[style] ~1662-~1662: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lamcreynoldsrealestateagentedmondok.com angelamcreynoldsrealestateagentoklahomacityok.com angelawalkerrealestateagentfortwort...
(ERG_LANG_WOORD)
[style] ~1663-~1663: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ynoldsrealestateagentoklahomacityok.com angelawalkerrealestateagentfortworthtx.com angeliita.com anill.cz antiqueresto...
(ERG_LANG_WOORD)
[uncategorized] ~1666-~1666: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...gentfortworthtx.com angeliita.com anill.cz antiquerestorationwork.com aonwin.info ...
(PUNT_GEEN_HL)
[uncategorized] ~1673-~1673: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...cssupplies.club archaemedia.net argotel.ru article.banditim.com articles.vip asdgr...
(PUNT_GEEN_HL)
[uncategorized] ~1688-~1688: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...is ativosdepapelnfe.org atlanta-webmail.top augmax.com australia-travel.news autode...
(PUNT_GEEN_HL)
[uncategorized] ~1723-~1723: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tmail.eu bestmassagechair.org bestn4box.ru bestpaydayloansonline.us.com betterbusi...
(PUNT_GEEN_HL)
[uncategorized] ~1733-~1733: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...aryoption bioisdlibneoc.com bishop-knot.xyz bl228.net blastzane.com blatnet.com blo...
(PUNT_GEEN_HL)
[uncategorized] ~1738-~1738: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om blatnet.com blogingmail.com blogrtui.ru blurelizer.com blurmailbox.com bola389....
(PUNT_GEEN_HL)
[uncategorized] ~1746-~1746: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...m bolmail.top bonanovamedicaa.com bonio.cz boofx.com boostsale.live boringverse.co...
(PUNT_GEEN_HL)
[uncategorized] ~1757-~1757: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...rd.net browndecorationlights.com btcptc.co burberryoutlet businessessay.online bus...
(PUNT_GEEN_HL)
[misspelling] ~1802-~1802: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ags.com cheaplouisvuit cheapmailhosting.pw cheapnike cheapoakley cheapoutlet cheap...
(NL_SIMPLE_REPLACE_PW)
[style] ~1816-~1816: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...eearringsbracelets.com christianloubout christinedangrealestateagenthendersonnv.com christinedangrealestateagentlasvega...
(ERG_LANG_WOORD)
[style] ~1817-~1817: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...stinedangrealestateagenthendersonnv.com christinedangrealestateagentlasvegasnv.com christinedangrealestateagentnorthla...
(ERG_LANG_WOORD)
[style] ~1818-~1818: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...istinedangrealestateagentlasvegasnv.com christinedangrealestateagentnorthlasvegasnv.com clashatclintonemail.com cleivleblea...
(ERG_LANG_WOORD)
[misspelling] ~1841-~1841: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...decorations.com corine.top corsairsmail.pw cosmicbridge.site cosmiccircuit.store c...
(NL_SIMPLE_REPLACE_PW)
[uncategorized] ~1858-~1858: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...omketodiet.kitchen cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestatea...
(PUNT_GEEN_HL)
[uncategorized] ~1859-~1859: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...chen cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestateagentchulavista...
(PUNT_GEEN_HL)
[style] ~1859-~1859: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...n cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestateagentchulavistaca.com daphneandersonrealestateagentsandie...
(ERG_LANG_WOORD)
[style] ~1860-~1860: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...andersonrealestateagentchulavistaca.com daphneandersonrealestateagentsandiegoca.com das-marketingbuero.de debbiesisnero...
(ERG_LANG_WOORD)
[uncategorized] ~1862-~1862: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...eagentsandiegoca.com das-marketingbuero.de debbiesisnerosdenkrealestateagentalbuquerquenm.com debbiesisnerosdenkrealestateagentlo...
(DE_ONVERWACHT)
[style] ~1863-~1863: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...rosdenkrealestateagentalbuquerquenm.com debbiesisnerosdenkrealestateagentloslunasnm.com debbiesisnerosdenkrealestateagentri...
(ERG_LANG_WOORD)
[style] ~1864-~1864: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...snerosdenkrealestateagentloslunasnm.com debbiesisnerosdenkrealestateagentrioranchonm.com debbiesisnerosdenkrealestateagentsa...
(ERG_LANG_WOORD)
[style] ~1865-~1865: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...nerosdenkrealestateagentrioranchonm.com debbiesisnerosdenkrealestateagentsantafenm.com definedgame.com delhinightqueen.com...
(ERG_LANG_WOORD)
[style] ~1869-~1869: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ame.com delhinightqueen.com delinda.top deniseclemensrealestateagentelkgroveca.com deniseclemensrealestateagentfolsomc...
(ERG_LANG_WOORD)
[style] ~1870-~1870: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...iseclemensrealestateagentelkgroveca.com deniseclemensrealestateagentfolsomca.com deniseclemensrealestateagentranchoc...
(ERG_LANG_WOORD)
[style] ~1871-~1871: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...eniseclemensrealestateagentfolsomca.com deniseclemensrealestateagentranchocordovaca.com deniseclemensrealestateagentsacrame...
(ERG_LANG_WOORD)
[style] ~1872-~1872: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...emensrealestateagentranchocordovaca.com deniseclemensrealestateagentsacramentoca.com denver-pop3.top dev256.xyz device-s...
(ERG_LANG_WOORD)
[style] ~1878-~1878: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...-new-auth.com dewabanget.com dezrus.com dianegaliciarealestateagentkatytx.com diflucan4all.top dinamuradrealestat...
(ERG_LANG_WOORD)
[uncategorized] ~1880-~1880: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...arealestateagentkatytx.com diflucan4all.top dinamuradrealestateagentchandleraz.com ...
(PUNT_GEEN_HL)
[style] ~1880-~1880: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lestateagentkatytx.com diflucan4all.top dinamuradrealestateagentchandleraz.com dinamuradrealestateagentglendaleaz....
(ERG_LANG_WOORD)
[style] ~1881-~1881: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... dinamuradrealestateagentchandleraz.com dinamuradrealestateagentglendaleaz.com dinamuradrealestateagentphoenixaz.c...
(ERG_LANG_WOORD)
[style] ~1882-~1882: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... dinamuradrealestateagentglendaleaz.com dinamuradrealestateagentphoenixaz.com dinamuradrealestateagentscottdaleaz...
(ERG_LANG_WOORD)
[style] ~1883-~1883: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m dinamuradrealestateagentphoenixaz.com dinamuradrealestateagentscottdaleaz.com disciplinethecity.sg discoplus.ca d...
(ERG_LANG_WOORD)
[uncategorized] ~1885-~1885: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...eagentscottdaleaz.com disciplinethecity.sg discoplus.ca diten.cz diyarbakirescleve...
(PUNT_GEEN_HL)
[uncategorized] ~1886-~1886: Vergeet de punt niet als het een afkorting is: “ca.” Schrijf het liever voluit.
Context: ...leaz.com disciplinethecity.sg discoplus.ca diten.cz diyarbakiresclevel5.xyz diyarb...
(AFKO_PUNT)
[uncategorized] ~1887-~1887: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...disciplinethecity.sg discoplus.ca diten.cz diyarbakiresclevel5.xyz diyarbakirescof...
(PUNT_GEEN_HL)
[uncategorized] ~1910-~1910: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...er downloadism.top dragonmoney dravizor.ru drawnoutalot.com dreamcoffeehouse.ir dr...
(PUNT_GEEN_HL)
[uncategorized] ~1912-~1912: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...or.ru drawnoutalot.com dreamcoffeehouse.ir drferril.com drferriltreatmentplans.com...
(PUNT_GEEN_HL)
[misspelling] ~1917-~1917: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ... drupaler.org duanbimgroup.com dukamail.pw dummyfox.com duniaangka.com duno.org dy...
(NL_SIMPLE_REPLACE_PW)
[uncategorized] ~1938-~1938: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...vatestrategies.club elfseo.com emailbiz.co emailnameref.com emaily.us emeyle.com e...
(PUNT_GEEN_HL)
[uncategorized] ~1943-~1943: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...om emissoes2022fiscal.org emsland-gruop.de eshreky.com estabbi.com estaxy.com estoque-mega...
(DE_ONVERWACHT)
[uncategorized] ~1966-~1966: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lick federalcash federalloan feelstudio.ru festivalday.click fetely.click filegear...
(PUNT_GEEN_HL)
[uncategorized] ~1969-~1969: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tivalday.click fetely.click filegear-sg.me findermaoil.online findingperry.com fir...
(PUNT_GEEN_HL)
[uncategorized] ~1972-~1972: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...oil.online findingperry.com firmen-news.at firstaidkit.services fiverek.pl flatole...
(PUNT_GEEN_HL)
[uncategorized] ~1974-~1974: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...en-news.at firstaidkit.services fiverek.pl flatoledtvs.com flexbud224.pl flipflopp...
(PUNT_GEEN_HL)
[uncategorized] ~1994-~1994: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....com frienced.com fruitingbodymushrooms.online funnetwork.xyz funny3delements.com funn...
(PUNT_GEEN_HL)
[uncategorized] ~2015-~2015: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...on.com germanytrips24.shop get-bitcoins.club get-bitcoins.online getcaper.click getg...
(PUNT_GEEN_HL)
[uncategorized] ~2016-~2016: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...s24.shop get-bitcoins.club get-bitcoins.online getcaper.click getgambol.click gethike....
(PUNT_GEEN_HL)
[style] ~2023-~2023: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lick getsupprts.click giantthink.online gilliancunninghamrealestateagentallentx.com gilliancunninghamrealestateagentcar...
(ERG_LANG_WOORD)
[style] ~2024-~2024: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...iancunninghamrealestateagentallentx.com gilliancunninghamrealestateagentcarrolltontx.com gilliancunninghamrealestateagentdal...
(ERG_LANG_WOORD)
[style] ~2025-~2025: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...nninghamrealestateagentcarrolltontx.com gilliancunninghamrealestateagentdallastx.com gilliancunninghamrealestateagentfri...
(ERG_LANG_WOORD)
[style] ~2026-~2026: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ancunninghamrealestateagentdallastx.com gilliancunninghamrealestateagentfriscotx.com giveblood.bar glamforo.com glassess...
(ERG_LANG_WOORD)
[uncategorized] ~2041-~2041: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....net gmailrasta.net gmailssdf.com gmeil.me gmxx.uno goaglie.com goinglownow.com go...
(PUNT_GEEN_HL)
[uncategorized] ~2053-~2053: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...earchengineranker gsasearchengineranker.xyz gsaser.ir gsaser.world gsaverifiedlist....
(PUNT_GEEN_HL)
[uncategorized] ~2054-~2054: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ranker gsasearchengineranker.xyz gsaser.ir gsaser.world gsaverifiedlist.download g...
(PUNT_GEEN_HL)
[uncategorized] ~2059-~2059: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...load gsavps.xyz guccioutlet gull-minnow.top h2oserver.tk haftacmtsescort.xyz hakiki...
(PUNT_GEEN_HL)
[misspelling] ~2060-~2060: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...z guccioutlet gull-minnow.top h2oserver.tk haftacmtsescort.xyz hakikidiyarbakiresc...
(NL_SIMPLE_REPLACE_TK)
[uncategorized] ~2062-~2062: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tacmtsescort.xyz hakikidiyarbakirescort.xyz hammerhandz.com hamsterbreeeding.com ha...
(PUNT_GEEN_HL)
[uncategorized] ~2075-~2075: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...hellohappy2.com hensailor.xyz herbhouse.ir hermesbirkin0.com hexagonaldrawings hoc...
(PUNT_GEEN_HL)
[uncategorized] ~2096-~2096: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om indiatravel.network indiaurbanportal.in info-binance.net infopostmail.com infor...
(PUNT_GEEN_HL)
[uncategorized] ~2109-~2109: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om itchydog.online itemxyz.com j-walker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam...
(PUNT_GEEN_HL)
[misspelling] ~2110-~2110: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ine itemxyz.com j-walker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamik...
(NL_SIMPLE_REPLACE_PW)
[misspelling] ~2111-~2111: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamikait.cf japantravel.ne...
(NL_SIMPLE_REPLACE_PW)
[uncategorized] ~2112-~2112: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...k-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamikait.cf japantravel.network jennife...
(PUNT_GEEN_HL)
[uncategorized] ~2113-~2113: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...osc-styl-klasa.pw jam4d.online jamikait.cf japantravel.network jenniferlawrence.uk...
(PUNT_GEEN_HL)
[style] ~2120-~2120: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m jokeray.com joyrideday.com jpsale.com judyvesselsrealestateagentdallastx.com judyvesselsrealestateagentgarlandtx...
(ERG_LANG_WOORD)
[style] ~2121-~2121: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... judyvesselsrealestateagentdallastx.com judyvesselsrealestateagentgarlandtx.com judyvesselsrealestateagentmckinneyt...
(ERG_LANG_WOORD)
[style] ~2122-~2122: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...judyvesselsrealestateagentgarlandtx.com judyvesselsrealestateagentmckinneytx.com judyvesselsrealestateagentplanotx.c...
(ERG_LANG_WOORD)
[style] ~2123-~2123: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...udyvesselsrealestateagentmckinneytx.com judyvesselsrealestateagentplanotx.com junkcarsfloridamiami.com k8xp.com k...
(ERG_LANG_WOORD)
[uncategorized] ~2135-~2135: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...nhyenvillas.com kiesag.xyz kinogokinogo.ru kinogoru.ru kipolongsleeve.com klassikp...
(PUNT_GEEN_HL)
[uncategorized] ~2136-~2136: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...com kiesag.xyz kinogokinogo.ru kinogoru.ru kipolongsleeve.com klassikpath.com krea...
(PUNT_GEEN_HL)
[uncategorized] ~2144-~2144: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lunch.lady-and-lunch.xyz lady-and-lunch.xyz lagunahomestudio.store lakemneadows.com...
(PUNT_GEEN_HL)
[uncategorized] ~2147-~2147: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...omestudio.store lakemneadows.com larond.cz laskarauto.com latestconsolegames.com l...
(PUNT_GEEN_HL)
[uncategorized] ~2153-~2153: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...es.com lemurshappy.org letslovethoughts.ir lilo.org linkbuilding live-media.fr liv...
(PUNT_GEEN_HL)
[uncategorized] ~2156-~2156: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...hts.ir lilo.org linkbuilding live-media.fr livelo-newsletter.xyz liveset lloydsban...
(AFKO_PUNT)
[uncategorized] ~2157-~2157: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...uilding live-media.fr livelo-newsletter.xyz liveset lloydsbank.device-prevention-sa...
(PUNT_GEEN_HL)
[uncategorized] ~2179-~2179: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...p lvoutlet m8sbeingm8s.com magic-garden.fun mai1www mail-ireland.com mail-jim mail....
(PUNT_GEEN_HL)
[uncategorized] ~2211-~2211: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ltopp.space mailtracenet.space mailtune.ir mailusaweb.space mailwebsites.space mai...
(PUNT_GEEN_HL)
[style] ~2221-~2221: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...com malin44.com.pl mariachisuroeste.com mariecharlesrealestateagentcorpuschristitx.com mariecharlesrealestateagenthoustont...
(ERG_LANG_WOORD)
[style] ~2222-~2222: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...arlesrealestateagentcorpuschristitx.com mariecharlesrealestateagenthoustontx.com mariecharlesrealestateagenthumbletx...
(ERG_LANG_WOORD)
[style] ~2223-~2223: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ariecharlesrealestateagenthoustontx.com mariecharlesrealestateagenthumbletx.com mariewallacerealestateagentfolsomca...
(ERG_LANG_WOORD)
[style] ~2224-~2224: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...mariecharlesrealestateagenthumbletx.com mariewallacerealestateagentfolsomca.com marketingsolutions.info marksypark....
(ERG_LANG_WOORD)
[uncategorized] ~2231-~2231: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ived.com martinandgang.com marver-coats.xyz marvsz.com mastermethodguide.us mazovia...
(PUNT_GEEN_HL)
[uncategorized] ~2245-~2245: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....net meidiee.life memberty.com mensorda.ru menterprise.app merkez34.com meupd.com ...
(PUNT_GEEN_HL)
[uncategorized] ~2249-~2249: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...e.app merkez34.com meupd.com miami-mail.top microsoft-office.live microsoft-office....
(PUNT_GEEN_HL)
[uncategorized] ~2250-~2250: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...upd.com miami-mail.top microsoft-office.live microsoft-office.live mikeandertonreale...
(PUNT_GEEN_HL)
[uncategorized] ~2251-~2251: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... microsoft-office.live microsoft-office.live mikeandertonrealestateagentmodestoca.co...
(PUNT_GEEN_HL)
[style] ~2251-~2251: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...osoft-office.live microsoft-office.live mikeandertonrealestateagentmodestoca.com mikinibikini.com mikirslot.co mikir...
(ERG_LANG_WOORD)
[uncategorized] ~2254-~2254: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...odestoca.com mikinibikini.com mikirslot.co mikirslot.com mikirslot.net miktyk mild...
(PUNT_GEEN_HL)
[uncategorized] ~2259-~2259: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...kirslot.net miktyk mildslot.cc mildslot.co mildslot.com mildslot.me mildslot.xyz m...
(PUNT_GEEN_HL)
[uncategorized] ~2261-~2261: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ot.cc mildslot.co mildslot.com mildslot.me mildslot.xyz mileselectricvehicles.com ...
(PUNT_GEEN_HL)
[uncategorized] ~2275-~2275: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ntreal5.top mortaji.us movenpickwaverly.vn movietv4u.com mulberryonline muscle-bui...
(PUNT_GEEN_HL)
[uncategorized] ~2278-~2278: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tv4u.com mulberryonline muscle-building.club musclejapancars.com mustdoindubai.com m...
(PUNT_GEEN_HL)
[uncategorized] ~2290-~2290: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...diyarescortbul.xyz neonfringe.com nerio.cz newfishingaccessories.com newpopularwat...
(PUNT_GEEN_HL)
[uncategorized] ~2297-~2297: Vergeet de punt niet als het een afkorting is: “ir.” Schrijf het liever voluit.
Context: ...newtonstores.com newyorkmetro5.top nex4.ir next4.ir nicewoodenbaskets.com nikefree...
(AFKO_PUNT)
[uncategorized] ~2298-~2298: Vergeet de punt niet als het een afkorting is: “ir.” Schrijf het liever voluit.
Context: ...res.com newyorkmetro5.top nex4.ir next4.ir nicewoodenbaskets.com nikefreerun ninin...
(AFKO_PUNT)
[style] ~2303-~2303: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... nininini.buzz nmail.work nonton389.com norahoguerealestateagentbrokenarrowok.com norahoguerealestateagenttulsaok.com...
(ERG_LANG_WOORD)
[style] ~2304-~2304: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...rahoguerealestateagentbrokenarrowok.com norahoguerealestateagenttulsaok.com novodigs.com nullcafe.com numelabs....
(ERG_LANG_WOORD)
[uncategorized] ~2318-~2318: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....com ofisdiyaresc200.xyz ofisdiyaresc3e.xyz okasa.pl olddog.care oldoutnewin.com on...
(PUNT_GEEN_HL)
[uncategorized] ~2319-~2319: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...iyaresc200.xyz ofisdiyaresc3e.xyz okasa.pl olddog.care oldoutnewin.com onetab.fr o...
(PUNT_GEEN_HL)
[uncategorized] ~2322-~2322: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...a.pl olddog.care oldoutnewin.com onetab.fr onewebmail.top onhaxx.me online-geld on...
(AFKO_PUNT)
[uncategorized] ~2324-~2324: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...win.com onetab.fr onewebmail.top onhaxx.me online-geld onlinecasino onlinejp onlin...
(PUNT_GEEN_HL)
[uncategorized] ~2328-~2328: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ld onlinecasino onlinejp onlinepaidjobs.me onlinepharmacy onlmktng.life opbeingop....
(PUNT_GEEN_HL)
[style] ~2345-~2345: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...irproducts.com palmgardenshopvillas.com pamrankinrealestateagentcarlsbadca.com pamrankinrealestateagentescondidoca...
(ERG_LANG_WOORD)
[style] ~2346-~2346: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... pamrankinrealestateagentcarlsbadca.com pamrankinrealestateagentescondidoca.com pamrankinrealestateagentoceansideca...
(ERG_LANG_WOORD)
[style] ~2347-~2347: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentescondidoca.com pamrankinrealestateagentoceansideca.com pamrankinrealestateagentsandiegoca....
(ERG_LANG_WOORD)
[style] ~2348-~2348: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentoceansideca.com pamrankinrealestateagentsandiegoca.com pamrankinrealestateagentsanmarcosca...
(ERG_LANG_WOORD)
[style] ~2349-~2349: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... pamrankinrealestateagentsandiegoca.com pamrankinrealestateagentsanmarcosca.com pamrankinrealestateagentvistaca.com...
(ERG_LANG_WOORD)
[style] ~2350-~2350: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentsanmarcosca.com pamrankinrealestateagentvistaca.com pancingqueen.com paris-gmail.top pa...
(ERG_LANG_WOORD)
[uncategorized] ~2353-~2353: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...istaca.com pancingqueen.com paris-gmail.top parkhyatt-phuquoc.vn parkwaymanufacturi...
(PUNT_GEEN_HL)
[uncategorized] ~2354-~2354: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...n.com paris-gmail.top parkhyatt-phuquoc.vn parkwaymanufacturing.net patmorganreale...
(PUNT_GEEN_HL)
[style] ~2355-~2355: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...att-phuquoc.vn parkwaymanufacturing.net patmorganrealestateagentgarlandtx.com patriciayoungrealestateagentdentont...
(ERG_LANG_WOORD)
[style] ~2356-~2356: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...t patmorganrealestateagentgarlandtx.com patriciayoungrealestateagentdentontx.com pawtrim.shop payday-loan paydaycash...
(ERG_LANG_WOORD)
[uncategorized] ~2362-~2362: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...n paydaycash paydayloan pdf-nfe-digital.xyz pdkiblasdmc92.com pediyarescsca.xyz per...
(PUNT_GEEN_HL)
[uncategorized] ~2366-~2366: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...performicsde.com pertomdiyarbakirescort.xyz philippinestravel.network phonezip pine...
(PUNT_GEEN_HL)
[uncategorized] ~2370-~2370: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...rk phonezip pine-and-onyx pine-and-onyx.xyz pinupcasino plasticvouchercards.com pla...
(PUNT_GEEN_HL)
[uncategorized] ~2374-~2374: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...ouchercards.com playmovies.stream ploki.fr ploooop.com poderfeminino.me pointbuysy...
(AFKO_PUNT)
[uncategorized] ~2376-~2376: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ream ploki.fr ploooop.com poderfeminino.me pointbuysys.com poisedtoshrike.com poke...
(PUNT_GEEN_HL)
[uncategorized] ~2382-~2382: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...d.com ponpesnuridinidris.com pop3boston.top popautomated.com popularde.top portable...
(PUNT_GEEN_HL)
[uncategorized] ~2386-~2386: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ....top portablespeaker.club portail-malin.fr portonomer.com postbinance.net powersho...
(AFKO_PUNT)
[uncategorized] ~2393-~2393: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...prayforgem.com prehers.com premium-mail.fr primesempresbuscando.org printemailtext...
(AFKO_PUNT)
[uncategorized] ~2408-~2408: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ushmail.fun pushpophop.com pystyportfel.pl pzdiyarsescortbul.xyz qqaonwin quantumn...
(PUNT_GEEN_HL)
[style] ~2415-~2415: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...meme.com qwertylock.com r2mcreation.com rachelegriegorealestateagentsantafenm.com radities.com ragnortheblue.com raja...
(ERG_LANG_WOORD)
[uncategorized] ~2443-~2443: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...xyz ropainterior-ck.com rospotrebnadzor.ru rowrowleft.com rta.cat rupayamail.com r...
(PUNT_GEEN_HL)
[uncategorized] ~2454-~2454: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...diyarescort21.xyz samedayloan sanaglobe.de sancto.xyz sanjose33.com saudidiving.com savin...
(DE_ONVERWACHT)
[uncategorized] ~2464-~2464: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...kmail.com scoldly.com sd-152415.dedibox.fr sd-152424.dedibox.fr searchenginerank s...
(AFKO_PUNT)
[uncategorized] ~2465-~2465: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ... sd-152415.dedibox.fr sd-152424.dedibox.fr searchenginerank seattle-mail1.top seco...
(AFKO_PUNT)
[style] ~2486-~2486: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... shavers.hair shavers.plus shavers.skin sheripatmanrealestateagentfortworthtx.com shoesjp.com shopjp.org shoppingdigi...
(ERG_LANG_WOORD)
[uncategorized] ~2496-~2496: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...impleklean skad-tabletki-na-odchudzanie.top skywardhub.online smartinvestment.homes...
(PUNT_GEEN_HL)
[uncategorized] ~2502-~2502: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...fttoiletpaper.com solarchargecontroller.club solarinverter.club solarpowered.online ...
(PUNT_GEEN_HL)
[uncategorized] ~2509-~2509: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...allads.com spinrewriter.app spotifygold.ir spuramexico2012.net staffingzone.xyz st...
(PUNT_GEEN_HL)
[uncategorized] ~2512-~2512: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...12.net staffingzone.xyz stars-and-glory.top stopstress.shop storejp straightenersau...
(PUNT_GEEN_HL)
[style] ~2519-~2519: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... successmarketplace.com sunglassescheap sunnipouncilrealestateagentedmondok.com sunnipouncilrealestateagentoklahoma...
(ERG_LANG_WOORD)
[style] ~2520-~2520: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...sunnipouncilrealestateagentedmondok.com sunnipouncilrealestateagentoklahomacityok.com sunnyvale33.com supportapp.click su...
(ERG_LANG_WOORD)
[style] ~2532-~2532: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...adalafil take-ur-vites.org talatalk.com tamaradorrisrealestateagentcarmichaelca.com tamaradorrisrealestateagentelkgrove...
(ERG_LANG_WOORD)
[style] ~2533-~2533: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...radorrisrealestateagentcarmichaelca.com tamaradorrisrealestateagentelkgroveca.com tamaradorrisrealestateagentfolsomca...
(ERG_LANG_WOORD)
[style] ~2534-~2534: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...maradorrisrealestateagentelkgroveca.com tamaradorrisrealestateagentfolsomca.com tamaradorrisrealestateagentsacramen...
(ERG_LANG_WOORD)
[style] ~2535-~2535: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...tamaradorrisrealestateagentfolsomca.com tamaradorrisrealestateagentsacramentoca.com tastyarabicacoffee.com tavon.xyz te...
(ERG_LANG_WOORD)
[misspelling] ~2544-~2544: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ... tenofovir terriblecoffee.org texanmail.pw th-vision.net thailandmovers.com thawki...
(NL_SIMPLE_REPLACE_PW)
[uncategorized] ~2551-~2551: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tter.online thecaper.click thedailygood.ir thedrywallclub.com thegambol.click theh...
(PUNT_GEEN_HL)
[uncategorized] ~2562-~2562: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tillacts.com tlienodclgoqlclt.com tmweb.ru tobu-wedding.com toddard.com tomekamosl...
(PUNT_GEEN_HL)
[style] ~2564-~2564: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m tmweb.ru tobu-wedding.com toddard.com tomekamosleyrealestateagentcedarhilltx.com tomekamosleyrealestateagentdesototx...
(ERG_LANG_WOORD)
[style] ~2565-~2565: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ekamosleyrealestateagentcedarhilltx.com tomekamosleyrealestateagentdesototx.com tomekamosleyrealestateagentlancaste...
(ERG_LANG_WOORD)
[style] ~2566-~2566: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...tomekamosleyrealestateagentdesototx.com tomekamosleyrealestateagentlancastertx.com top1-casino.site topgun.fit topping...
(ERG_LANG_WOORD)
[uncategorized] ~2568-~2568: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lestateagentlancastertx.com top1-casino.site topgun.fit toppinggoods.com topstream10...
(PUNT_GEEN_HL)
[style] ~2572-~2572: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ggoods.com topstream10.com topxxx69.com tracyfigueroarealestateagentsacramentoca.com tradingcogroup.ir travel-e-store.co...
(ERG_LANG_WOORD)
[uncategorized] ~2574-~2574: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ateagentsacramentoca.com tradingcogroup.ir travel-e-store.com travellerapp.click t...
(PUNT_GEEN_HL)
[uncategorized] ~2586-~2586: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ick tubered69.com tvtap.fun tw1owebmail.top twowebmail.top twoxxx.top ufficialeairm...
(PUNT_GEEN_HL)
[misspelling] ~2610-~2610: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...tacadostanley.com variots.com vblogmail.pw vcams.info veinflower.xyz vet33.com via...
(NL_SIMPLE_REPLACE_PW)
[uncategorized] ~2617-~2617: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...gra visagency.online vitobase.com vlspm.ga vocalmajoritynow.com vosos.xyz vuitton ...
(PUNT_GEEN_HL)
[uncategorized] ~2661-~2661: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...bananaulx.com yenidiyarbakir2ofisescort.xyz yenidiyaresc76.xyz yenidiyarescucuzbyn0...
(PUNT_GEEN_HL)
[uncategorized] ~2679-~2679: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...about.com zt.co.uk zuperious.club zzuma.ru
(PUNT_GEEN_HL)
🪛 GitHub Check: Spell Check with Typos
blacklist/domain-partial.txt
[warning] 125-125:
"pn" should be "on".
[warning] 128-128:
"pn" should be "on".
[warning] 166-166:
"benj" should be "binge".
[warning] 254-254:
"pn" should be "on".
[warning] 285-285:
"pn" should be "on".
[warning] 324-324:
"pn" should be "on".
[warning] 325-325:
"pn" should be "on".
[warning] 329-329:
"pn" should be "on".
[warning] 338-338:
"pn" should be "on".
[warning] 382-382:
"pn" should be "on".
🪛 GitHub Actions: Typo Checks
blacklist/domain-partial.txt
[error] 125-125: pn should be on
[error] 128-128: pn should be on
[error] 166-166: benj should be binge
[error] 254-254: pn should be on
[error] 285-285: pn should be on
[error] 324-324: pn should be on
[error] 325-325: pn should be on
[error] 329-329: pn should be on
[error] 338-338: pn should be on
[error] 382-382: pn should be on
[error] 578-578: pn should be on
[error] 616-616: boxs should be box or boxes
[error] 635-635: goood should be good
[error] 643-643: coffe should be coffee
[error] 764-764: pn should be on
[error] 792-792: pn should be on
[error] 1082-1082: oueue should be queue
[error] 1090-1090: oyu should be you
[error] 1191-1191: rade should be read, raid, or rate
[error] 1434-1434: ue should be use or due
[error] 1438-1438: pn should be on
[error] 1453-1453: pn should be on
[error] 1542-1542: wil should be will or well
[error] 1693-1693: awsome should be awesome
[error] 1943-1943: gruop should be group
[error] 1984-1984: fre should be free
[error] 2111-2111: styl should be style
🔇 Additional comments (23)
blacklist/ip.txt (1)
1-51: Comprehensive IP blacklist for improved spam protectionThis new file contains 51 well-formatted IP addresses and network ranges in CIDR notation that will be used to block known spam sources. The IP ranges appear to be properly formatted with appropriate network prefixes.
classes/helpers/FrmAppHelper.php (1)
2393-2404: Access modifier change to support antispam systemThe
generate_new_key()method has been changed fromprivatetopublicto allow it to be utilized by other components, particularly the new antispam features. This change properly supports the dynamic key generation needed for honeypot implementation and other security measures.blacklist/domain-partial.txt (2)
1-2679: Well-structured comprehensive domain blacklist for spam detection.This is a well-organized resource file containing patterns of suspicious and spam-associated domains. The list includes gambling sites, pharmaceuticals, scams, disposable email providers, and other domains commonly used for spam.
The structure supports both exact domain matching and partial/suffix matching with leading periods, which is an effective approach for domain filtering.
🧰 Tools
🪛 LanguageTool
[typographical] ~19-~19: Twee of meer opeenvolgende punten; 1 of 3 is gebruikelijk.
Context: ...ine.info -spin -tw.biz -tw.info -tw.org ..mediabey.com .00860.net .0amail.top .0px...(DOUBLE_PUNCTUATION)
[misspelling] ~28-~28: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...om .101livemail.top .10mail.org .10mail.tk .1146.info .163.com.com .1900.io .1amai...(NL_SIMPLE_REPLACE_TK)
[style] ~35-~35: Netter is om het uit te schrijven.
Context: ....1bayandiyarbakiresc.xyz .1website.net .1x.biz .2012moviedownloadfree.com .24space...(_10X)
[style] ~59-~59: Netter is om het uit te schrijven.
Context: ... .8358699.com .86kk.net .882113322.com .8x.biz .9227xpj.com .92gmail.com .992459.c...(_10X)
[uncategorized] ~84-~84: Juist is: “eens”.
Context: ...waw.pl .akk.ro .aktifbil.com .alcaldede.es .alexander-skarsgard.net .alexhaleighga...(KIJK_ES_PREMIUM)
[misspelling] ~327-~327: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...msq0.com .cn.pn .co.at.pn .co.cc .co.kr.iki.kr .co.kr.lbe.kr .co.uk.pn .coarco.com....(NL_SIMPLE_REPLACE_IKI)
[misspelling] ~347-~347: ‘config’ zou fout kunnen zijn. Misschien bedoelt u: “configuratie”
Context: ...iting.com .comrugvvokrug.ru .conf.work .config.work .consored.com .construtrabajo.com ...(NL_SIMPLE_REPLACE_CONFIG)
[misspelling] ~514-~514: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...xpertadvisormt4ea.com .externalizare-it.pw .extra-breast.info .extra-penis-enlarge...(NL_SIMPLE_REPLACE_PW)
[misspelling] ~640-~640: Gram hoort afgekort te worden als ‘g’, groeten kun je beter voluit schrijven.
Context: ...ts.top .goverloe.com .gowactivator.com .gr.vu .gr8domain.biz .grammi.sg .green-cof...(NL_SIMPLE_REPLACE_GR)
[misspelling] ~653-~653: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ineranker.online .gsasearchengineranker.pw .gsasearchengineranker.site .gsasearche...(NL_SIMPLE_REPLACE_PW)
[style] ~660-~660: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...xyz .gsasearchenginerankerdiscount.com .gsasearchenginerankersocialser.com .gsaserlist.com .gsaverifiedlist.do...(ERG_LANG_WOORD)
[misspelling] ~729-~729: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...giveaways.xyz .ihappytime.com .ihc.xyz .iki.kr .ilink.website .ilyushu.com .imagens...(NL_SIMPLE_REPLACE_IKI)
[uncategorized] ~929-~929: Dit lijkt niet correct te zijn.
Context: ....makingdomes.com .maleenhancement.club .malsers.com .manidn.com .mantly.com .mantul.xyz...(IETS_KLEINS)
[misspelling] ~1022-~1022: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...waw.pl .neonfringe.com .nesine.fun .net.iki.kr .netbreeze.site .netmail.tk .newfish...(NL_SIMPLE_REPLACE_IKI)
[misspelling] ~1024-~1024: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...un .net.iki.kr .netbreeze.site .netmail.tk .newfishingaccessories.com .newpopularw...(NL_SIMPLE_REPLACE_TK)
[misspelling] ~1148-~1148: ‘pp’ zou fout kunnen zijn. Misschien bedoelt u: “p.p.”
Context: ....powds.com .poy.kr .pozycjonowanie8.pl .pp.ua .ppc-e.com .ppoet.com .prclosing.inf...(NL_SIMPLE_REPLACE_PP)
[misspelling] ~1169-~1169: ‘pp’ zou fout kunnen zijn. Misschien bedoelt u: “p.p.”
Context: ...esde.com .prowebmail.online .pryaniki68.pp.ru .ps4.rocks .ptmm.com .publicidadedig...(NL_SIMPLE_REPLACE_PP)
[misspelling] ~1190-~1190: Verwacht werd “voorbedachten rade”, “te rade” of mogelijk “raden”.
Context: ...uickmail.pl .quixyl.com .qwertylock.com .rade.waw.pl .radi6.com .radities.com .ragnor...(VOORBEDACHTEN_RADE)
[style] ~1314-~1314: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...n.com .snz873.com .socialrpmailing.com .socialsergsasearchengineranker.com .softhandscream.com .softtoiletpape...(ERG_LANG_WOORD)
[misspelling] ~1405-~1405: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...m .toshikokaori.xyz .totozyn.com .tpost.pw .tr.vu .tradingcogroup.ir .traduzioni-i...(NL_SIMPLE_REPLACE_PW)
[misspelling] ~1414-~1414: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ellerapp.click .trendesmail.com .tricks.pw .trillania.com .trinityanokamn.org .tru...(NL_SIMPLE_REPLACE_PW)
[misspelling] ~1526-~1526: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ilm1.site .webmailmeta.site .webmailpro.pw .webolowitz.com .webproton.site .webvan...(NL_SIMPLE_REPLACE_PW)
[misspelling] ~1586-~1586: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ....yandexx.info .yankeeroo.com .yertxenor.tk .yffk.xyz .ylfpay.cn .ylixo.com .yohana...(NL_SIMPLE_REPLACE_TK)
[uncategorized] ~1623-~1623: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...electricscooter.com 1bayandiyarbakiresc.xyz 1win- 1xbet- 2012-2016.ru 2018.top 21ja...(PUNT_GEEN_HL)
[uncategorized] ~1628-~1628: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...in- 1xbet- 2012-2016.ru 2018.top 21jack.club 24hstyle.shop 2605mails 26forex 2escort...(PUNT_GEEN_HL)
[uncategorized] ~1629-~1629: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...2-2016.ru 2018.top 21jack.club 24hstyle.shop 2605mails 26forex 2escortdiyarbakir2.xy...(PUNT_GEEN_HL)
[uncategorized] ~1635-~1635: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... 360ezzz.com 389production.com 4evrmail.shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz ...(PUNT_GEEN_HL)
[uncategorized] ~1636-~1636: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... 389production.com 4evrmail.shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.bu...(PUNT_GEEN_HL)
[uncategorized] ~1639-~1639: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.buzz a4ktube.com acceder-dispo...(PUNT_GEEN_HL)
[uncategorized] ~1640-~1640: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...yz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.buzz a4ktube.com acceder-dispositivonovob.co...(PUNT_GEEN_HL)
[uncategorized] ~1650-~1650: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... affordablespecs.online ago12z7v9lo9a0f.lol air-max air-maxs airj0 airjordan airjor...(PUNT_GEEN_HL)
[style] ~1661-~1661: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...allmail.gdn alxmedia.online amoriza.net angelamcreynoldsrealestateagentedmondok.com angelamcreynoldsrealestateagentokla...(ERG_LANG_WOORD)
[style] ~1662-~1662: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lamcreynoldsrealestateagentedmondok.com angelamcreynoldsrealestateagentoklahomacityok.com angelawalkerrealestateagentfortwort...(ERG_LANG_WOORD)
[style] ~1663-~1663: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ynoldsrealestateagentoklahomacityok.com angelawalkerrealestateagentfortworthtx.com angeliita.com anill.cz antiqueresto...(ERG_LANG_WOORD)
[uncategorized] ~1666-~1666: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...gentfortworthtx.com angeliita.com anill.cz antiquerestorationwork.com aonwin.info ...(PUNT_GEEN_HL)
[uncategorized] ~1673-~1673: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...cssupplies.club archaemedia.net argotel.ru article.banditim.com articles.vip asdgr...(PUNT_GEEN_HL)
[uncategorized] ~1688-~1688: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...is ativosdepapelnfe.org atlanta-webmail.top augmax.com australia-travel.news autode...(PUNT_GEEN_HL)
[uncategorized] ~1723-~1723: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tmail.eu bestmassagechair.org bestn4box.ru bestpaydayloansonline.us.com betterbusi...(PUNT_GEEN_HL)
[uncategorized] ~1733-~1733: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...aryoption bioisdlibneoc.com bishop-knot.xyz bl228.net blastzane.com blatnet.com blo...(PUNT_GEEN_HL)
[uncategorized] ~1738-~1738: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om blatnet.com blogingmail.com blogrtui.ru blurelizer.com blurmailbox.com bola389....(PUNT_GEEN_HL)
[uncategorized] ~1746-~1746: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...m bolmail.top bonanovamedicaa.com bonio.cz boofx.com boostsale.live boringverse.co...(PUNT_GEEN_HL)
[uncategorized] ~1757-~1757: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...rd.net browndecorationlights.com btcptc.co burberryoutlet businessessay.online bus...(PUNT_GEEN_HL)
[misspelling] ~1802-~1802: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ags.com cheaplouisvuit cheapmailhosting.pw cheapnike cheapoakley cheapoutlet cheap...(NL_SIMPLE_REPLACE_PW)
[style] ~1816-~1816: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...eearringsbracelets.com christianloubout christinedangrealestateagenthendersonnv.com christinedangrealestateagentlasvega...(ERG_LANG_WOORD)
[style] ~1817-~1817: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...stinedangrealestateagenthendersonnv.com christinedangrealestateagentlasvegasnv.com christinedangrealestateagentnorthla...(ERG_LANG_WOORD)
[style] ~1818-~1818: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...istinedangrealestateagentlasvegasnv.com christinedangrealestateagentnorthlasvegasnv.com clashatclintonemail.com cleivleblea...(ERG_LANG_WOORD)
[misspelling] ~1841-~1841: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...decorations.com corine.top corsairsmail.pw cosmicbridge.site cosmiccircuit.store c...(NL_SIMPLE_REPLACE_PW)
[uncategorized] ~1858-~1858: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...omketodiet.kitchen cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestatea...(PUNT_GEEN_HL)
[uncategorized] ~1859-~1859: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...chen cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestateagentchulavista...(PUNT_GEEN_HL)
[style] ~1859-~1859: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...n cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestateagentchulavistaca.com daphneandersonrealestateagentsandie...(ERG_LANG_WOORD)
[style] ~1860-~1860: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...andersonrealestateagentchulavistaca.com daphneandersonrealestateagentsandiegoca.com das-marketingbuero.de debbiesisnero...(ERG_LANG_WOORD)
[uncategorized] ~1862-~1862: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...eagentsandiegoca.com das-marketingbuero.de debbiesisnerosdenkrealestateagentalbuquerquenm.com debbiesisnerosdenkrealestateagentlo...(DE_ONVERWACHT)
[style] ~1863-~1863: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...rosdenkrealestateagentalbuquerquenm.com debbiesisnerosdenkrealestateagentloslunasnm.com debbiesisnerosdenkrealestateagentri...(ERG_LANG_WOORD)
[style] ~1864-~1864: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...snerosdenkrealestateagentloslunasnm.com debbiesisnerosdenkrealestateagentrioranchonm.com debbiesisnerosdenkrealestateagentsa...(ERG_LANG_WOORD)
[style] ~1865-~1865: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...nerosdenkrealestateagentrioranchonm.com debbiesisnerosdenkrealestateagentsantafenm.com definedgame.com delhinightqueen.com...(ERG_LANG_WOORD)
[style] ~1869-~1869: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ame.com delhinightqueen.com delinda.top deniseclemensrealestateagentelkgroveca.com deniseclemensrealestateagentfolsomc...(ERG_LANG_WOORD)
[style] ~1870-~1870: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...iseclemensrealestateagentelkgroveca.com deniseclemensrealestateagentfolsomca.com deniseclemensrealestateagentranchoc...(ERG_LANG_WOORD)
[style] ~1871-~1871: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...eniseclemensrealestateagentfolsomca.com deniseclemensrealestateagentranchocordovaca.com deniseclemensrealestateagentsacrame...(ERG_LANG_WOORD)
[style] ~1872-~1872: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...emensrealestateagentranchocordovaca.com deniseclemensrealestateagentsacramentoca.com denver-pop3.top dev256.xyz device-s...(ERG_LANG_WOORD)
[style] ~1878-~1878: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...-new-auth.com dewabanget.com dezrus.com dianegaliciarealestateagentkatytx.com diflucan4all.top dinamuradrealestat...(ERG_LANG_WOORD)
[uncategorized] ~1880-~1880: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...arealestateagentkatytx.com diflucan4all.top dinamuradrealestateagentchandleraz.com ...(PUNT_GEEN_HL)
[style] ~1880-~1880: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lestateagentkatytx.com diflucan4all.top dinamuradrealestateagentchandleraz.com dinamuradrealestateagentglendaleaz....(ERG_LANG_WOORD)
[style] ~1881-~1881: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... dinamuradrealestateagentchandleraz.com dinamuradrealestateagentglendaleaz.com dinamuradrealestateagentphoenixaz.c...(ERG_LANG_WOORD)
[style] ~1882-~1882: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... dinamuradrealestateagentglendaleaz.com dinamuradrealestateagentphoenixaz.com dinamuradrealestateagentscottdaleaz...(ERG_LANG_WOORD)
[style] ~1883-~1883: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m dinamuradrealestateagentphoenixaz.com dinamuradrealestateagentscottdaleaz.com disciplinethecity.sg discoplus.ca d...(ERG_LANG_WOORD)
[uncategorized] ~1885-~1885: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...eagentscottdaleaz.com disciplinethecity.sg discoplus.ca diten.cz diyarbakirescleve...(PUNT_GEEN_HL)
[uncategorized] ~1886-~1886: Vergeet de punt niet als het een afkorting is: “ca.” Schrijf het liever voluit.
Context: ...leaz.com disciplinethecity.sg discoplus.ca diten.cz diyarbakiresclevel5.xyz diyarb...(AFKO_PUNT)
[uncategorized] ~1887-~1887: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...disciplinethecity.sg discoplus.ca diten.cz diyarbakiresclevel5.xyz diyarbakirescof...(PUNT_GEEN_HL)
[uncategorized] ~1910-~1910: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...er downloadism.top dragonmoney dravizor.ru drawnoutalot.com dreamcoffeehouse.ir dr...(PUNT_GEEN_HL)
[uncategorized] ~1912-~1912: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...or.ru drawnoutalot.com dreamcoffeehouse.ir drferril.com drferriltreatmentplans.com...(PUNT_GEEN_HL)
[misspelling] ~1917-~1917: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ... drupaler.org duanbimgroup.com dukamail.pw dummyfox.com duniaangka.com duno.org dy...(NL_SIMPLE_REPLACE_PW)
[uncategorized] ~1938-~1938: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...vatestrategies.club elfseo.com emailbiz.co emailnameref.com emaily.us emeyle.com e...(PUNT_GEEN_HL)
[uncategorized] ~1943-~1943: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...om emissoes2022fiscal.org emsland-gruop.de eshreky.com estabbi.com estaxy.com estoque-mega...(DE_ONVERWACHT)
[uncategorized] ~1966-~1966: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lick federalcash federalloan feelstudio.ru festivalday.click fetely.click filegear...(PUNT_GEEN_HL)
[uncategorized] ~1969-~1969: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tivalday.click fetely.click filegear-sg.me findermaoil.online findingperry.com fir...(PUNT_GEEN_HL)
[uncategorized] ~1972-~1972: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...oil.online findingperry.com firmen-news.at firstaidkit.services fiverek.pl flatole...(PUNT_GEEN_HL)
[uncategorized] ~1974-~1974: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...en-news.at firstaidkit.services fiverek.pl flatoledtvs.com flexbud224.pl flipflopp...(PUNT_GEEN_HL)
[uncategorized] ~1994-~1994: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....com frienced.com fruitingbodymushrooms.online funnetwork.xyz funny3delements.com funn...(PUNT_GEEN_HL)
[uncategorized] ~2015-~2015: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...on.com germanytrips24.shop get-bitcoins.club get-bitcoins.online getcaper.click getg...(PUNT_GEEN_HL)
[uncategorized] ~2016-~2016: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...s24.shop get-bitcoins.club get-bitcoins.online getcaper.click getgambol.click gethike....(PUNT_GEEN_HL)
[style] ~2023-~2023: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lick getsupprts.click giantthink.online gilliancunninghamrealestateagentallentx.com gilliancunninghamrealestateagentcar...(ERG_LANG_WOORD)
[style] ~2024-~2024: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...iancunninghamrealestateagentallentx.com gilliancunninghamrealestateagentcarrolltontx.com gilliancunninghamrealestateagentdal...(ERG_LANG_WOORD)
[style] ~2025-~2025: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...nninghamrealestateagentcarrolltontx.com gilliancunninghamrealestateagentdallastx.com gilliancunninghamrealestateagentfri...(ERG_LANG_WOORD)
[style] ~2026-~2026: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ancunninghamrealestateagentdallastx.com gilliancunninghamrealestateagentfriscotx.com giveblood.bar glamforo.com glassess...(ERG_LANG_WOORD)
[uncategorized] ~2041-~2041: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....net gmailrasta.net gmailssdf.com gmeil.me gmxx.uno goaglie.com goinglownow.com go...(PUNT_GEEN_HL)
[uncategorized] ~2053-~2053: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...earchengineranker gsasearchengineranker.xyz gsaser.ir gsaser.world gsaverifiedlist....(PUNT_GEEN_HL)
[uncategorized] ~2054-~2054: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ranker gsasearchengineranker.xyz gsaser.ir gsaser.world gsaverifiedlist.download g...(PUNT_GEEN_HL)
[uncategorized] ~2059-~2059: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...load gsavps.xyz guccioutlet gull-minnow.top h2oserver.tk haftacmtsescort.xyz hakiki...(PUNT_GEEN_HL)
[misspelling] ~2060-~2060: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...z guccioutlet gull-minnow.top h2oserver.tk haftacmtsescort.xyz hakikidiyarbakiresc...(NL_SIMPLE_REPLACE_TK)
[uncategorized] ~2062-~2062: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tacmtsescort.xyz hakikidiyarbakirescort.xyz hammerhandz.com hamsterbreeeding.com ha...(PUNT_GEEN_HL)
[uncategorized] ~2075-~2075: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...hellohappy2.com hensailor.xyz herbhouse.ir hermesbirkin0.com hexagonaldrawings hoc...(PUNT_GEEN_HL)
[uncategorized] ~2096-~2096: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om indiatravel.network indiaurbanportal.in info-binance.net infopostmail.com infor...(PUNT_GEEN_HL)
[uncategorized] ~2109-~2109: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om itchydog.online itemxyz.com j-walker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam...(PUNT_GEEN_HL)
[misspelling] ~2110-~2110: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ine itemxyz.com j-walker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamik...(NL_SIMPLE_REPLACE_PW)
[misspelling] ~2111-~2111: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamikait.cf japantravel.ne...(NL_SIMPLE_REPLACE_PW)
[uncategorized] ~2112-~2112: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...k-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamikait.cf japantravel.network jennife...(PUNT_GEEN_HL)
[uncategorized] ~2113-~2113: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...osc-styl-klasa.pw jam4d.online jamikait.cf japantravel.network jenniferlawrence.uk...(PUNT_GEEN_HL)
[style] ~2120-~2120: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m jokeray.com joyrideday.com jpsale.com judyvesselsrealestateagentdallastx.com judyvesselsrealestateagentgarlandtx...(ERG_LANG_WOORD)
[style] ~2121-~2121: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... judyvesselsrealestateagentdallastx.com judyvesselsrealestateagentgarlandtx.com judyvesselsrealestateagentmckinneyt...(ERG_LANG_WOORD)
[style] ~2122-~2122: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...judyvesselsrealestateagentgarlandtx.com judyvesselsrealestateagentmckinneytx.com judyvesselsrealestateagentplanotx.c...(ERG_LANG_WOORD)
[style] ~2123-~2123: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...udyvesselsrealestateagentmckinneytx.com judyvesselsrealestateagentplanotx.com junkcarsfloridamiami.com k8xp.com k...(ERG_LANG_WOORD)
[uncategorized] ~2135-~2135: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...nhyenvillas.com kiesag.xyz kinogokinogo.ru kinogoru.ru kipolongsleeve.com klassikp...(PUNT_GEEN_HL)
[uncategorized] ~2136-~2136: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...com kiesag.xyz kinogokinogo.ru kinogoru.ru kipolongsleeve.com klassikpath.com krea...(PUNT_GEEN_HL)
[uncategorized] ~2144-~2144: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lunch.lady-and-lunch.xyz lady-and-lunch.xyz lagunahomestudio.store lakemneadows.com...(PUNT_GEEN_HL)
[uncategorized] ~2147-~2147: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...omestudio.store lakemneadows.com larond.cz laskarauto.com latestconsolegames.com l...(PUNT_GEEN_HL)
[uncategorized] ~2153-~2153: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...es.com lemurshappy.org letslovethoughts.ir lilo.org linkbuilding live-media.fr liv...(PUNT_GEEN_HL)
[uncategorized] ~2156-~2156: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...hts.ir lilo.org linkbuilding live-media.fr livelo-newsletter.xyz liveset lloydsban...(AFKO_PUNT)
[uncategorized] ~2157-~2157: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...uilding live-media.fr livelo-newsletter.xyz liveset lloydsbank.device-prevention-sa...(PUNT_GEEN_HL)
[uncategorized] ~2179-~2179: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...p lvoutlet m8sbeingm8s.com magic-garden.fun mai1www mail-ireland.com mail-jim mail....(PUNT_GEEN_HL)
[uncategorized] ~2211-~2211: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ltopp.space mailtracenet.space mailtune.ir mailusaweb.space mailwebsites.space mai...(PUNT_GEEN_HL)
[style] ~2221-~2221: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...com malin44.com.pl mariachisuroeste.com mariecharlesrealestateagentcorpuschristitx.com mariecharlesrealestateagenthoustont...(ERG_LANG_WOORD)
[style] ~2222-~2222: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...arlesrealestateagentcorpuschristitx.com mariecharlesrealestateagenthoustontx.com mariecharlesrealestateagenthumbletx...(ERG_LANG_WOORD)
[style] ~2223-~2223: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ariecharlesrealestateagenthoustontx.com mariecharlesrealestateagenthumbletx.com mariewallacerealestateagentfolsomca...(ERG_LANG_WOORD)
[style] ~2224-~2224: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...mariecharlesrealestateagenthumbletx.com mariewallacerealestateagentfolsomca.com marketingsolutions.info marksypark....(ERG_LANG_WOORD)
[uncategorized] ~2231-~2231: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ived.com martinandgang.com marver-coats.xyz marvsz.com mastermethodguide.us mazovia...(PUNT_GEEN_HL)
[uncategorized] ~2245-~2245: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....net meidiee.life memberty.com mensorda.ru menterprise.app merkez34.com meupd.com ...(PUNT_GEEN_HL)
[uncategorized] ~2249-~2249: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...e.app merkez34.com meupd.com miami-mail.top microsoft-office.live microsoft-office....(PUNT_GEEN_HL)
[uncategorized] ~2250-~2250: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...upd.com miami-mail.top microsoft-office.live microsoft-office.live mikeandertonreale...(PUNT_GEEN_HL)
[uncategorized] ~2251-~2251: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... microsoft-office.live microsoft-office.live mikeandertonrealestateagentmodestoca.co...(PUNT_GEEN_HL)
[style] ~2251-~2251: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...osoft-office.live microsoft-office.live mikeandertonrealestateagentmodestoca.com mikinibikini.com mikirslot.co mikir...(ERG_LANG_WOORD)
[uncategorized] ~2254-~2254: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...odestoca.com mikinibikini.com mikirslot.co mikirslot.com mikirslot.net miktyk mild...(PUNT_GEEN_HL)
[uncategorized] ~2259-~2259: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...kirslot.net miktyk mildslot.cc mildslot.co mildslot.com mildslot.me mildslot.xyz m...(PUNT_GEEN_HL)
[uncategorized] ~2261-~2261: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ot.cc mildslot.co mildslot.com mildslot.me mildslot.xyz mileselectricvehicles.com ...(PUNT_GEEN_HL)
[uncategorized] ~2275-~2275: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ntreal5.top mortaji.us movenpickwaverly.vn movietv4u.com mulberryonline muscle-bui...(PUNT_GEEN_HL)
[uncategorized] ~2278-~2278: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tv4u.com mulberryonline muscle-building.club musclejapancars.com mustdoindubai.com m...(PUNT_GEEN_HL)
[uncategorized] ~2290-~2290: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...diyarescortbul.xyz neonfringe.com nerio.cz newfishingaccessories.com newpopularwat...(PUNT_GEEN_HL)
[uncategorized] ~2297-~2297: Vergeet de punt niet als het een afkorting is: “ir.” Schrijf het liever voluit.
Context: ...newtonstores.com newyorkmetro5.top nex4.ir next4.ir nicewoodenbaskets.com nikefree...(AFKO_PUNT)
[uncategorized] ~2298-~2298: Vergeet de punt niet als het een afkorting is: “ir.” Schrijf het liever voluit.
Context: ...res.com newyorkmetro5.top nex4.ir next4.ir nicewoodenbaskets.com nikefreerun ninin...(AFKO_PUNT)
[style] ~2303-~2303: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... nininini.buzz nmail.work nonton389.com norahoguerealestateagentbrokenarrowok.com norahoguerealestateagenttulsaok.com...(ERG_LANG_WOORD)
[style] ~2304-~2304: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...rahoguerealestateagentbrokenarrowok.com norahoguerealestateagenttulsaok.com novodigs.com nullcafe.com numelabs....(ERG_LANG_WOORD)
[uncategorized] ~2318-~2318: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....com ofisdiyaresc200.xyz ofisdiyaresc3e.xyz okasa.pl olddog.care oldoutnewin.com on...(PUNT_GEEN_HL)
[uncategorized] ~2319-~2319: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...iyaresc200.xyz ofisdiyaresc3e.xyz okasa.pl olddog.care oldoutnewin.com onetab.fr o...(PUNT_GEEN_HL)
[uncategorized] ~2322-~2322: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...a.pl olddog.care oldoutnewin.com onetab.fr onewebmail.top onhaxx.me online-geld on...(AFKO_PUNT)
[uncategorized] ~2324-~2324: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...win.com onetab.fr onewebmail.top onhaxx.me online-geld onlinecasino onlinejp onlin...(PUNT_GEEN_HL)
[uncategorized] ~2328-~2328: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ld onlinecasino onlinejp onlinepaidjobs.me onlinepharmacy onlmktng.life opbeingop....(PUNT_GEEN_HL)
[style] ~2345-~2345: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...irproducts.com palmgardenshopvillas.com pamrankinrealestateagentcarlsbadca.com pamrankinrealestateagentescondidoca...(ERG_LANG_WOORD)
[style] ~2346-~2346: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... pamrankinrealestateagentcarlsbadca.com pamrankinrealestateagentescondidoca.com pamrankinrealestateagentoceansideca...(ERG_LANG_WOORD)
[style] ~2347-~2347: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentescondidoca.com pamrankinrealestateagentoceansideca.com pamrankinrealestateagentsandiegoca....(ERG_LANG_WOORD)
[style] ~2348-~2348: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentoceansideca.com pamrankinrealestateagentsandiegoca.com pamrankinrealestateagentsanmarcosca...(ERG_LANG_WOORD)
[style] ~2349-~2349: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... pamrankinrealestateagentsandiegoca.com pamrankinrealestateagentsanmarcosca.com pamrankinrealestateagentvistaca.com...(ERG_LANG_WOORD)
[style] ~2350-~2350: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentsanmarcosca.com pamrankinrealestateagentvistaca.com pancingqueen.com paris-gmail.top pa...(ERG_LANG_WOORD)
[uncategorized] ~2353-~2353: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...istaca.com pancingqueen.com paris-gmail.top parkhyatt-phuquoc.vn parkwaymanufacturi...(PUNT_GEEN_HL)
[uncategorized] ~2354-~2354: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...n.com paris-gmail.top parkhyatt-phuquoc.vn parkwaymanufacturing.net patmorganreale...(PUNT_GEEN_HL)
[style] ~2355-~2355: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...att-phuquoc.vn parkwaymanufacturing.net patmorganrealestateagentgarlandtx.com patriciayoungrealestateagentdentont...(ERG_LANG_WOORD)
[style] ~2356-~2356: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...t patmorganrealestateagentgarlandtx.com patriciayoungrealestateagentdentontx.com pawtrim.shop payday-loan paydaycash...(ERG_LANG_WOORD)
[uncategorized] ~2362-~2362: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...n paydaycash paydayloan pdf-nfe-digital.xyz pdkiblasdmc92.com pediyarescsca.xyz per...(PUNT_GEEN_HL)
[uncategorized] ~2366-~2366: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...performicsde.com pertomdiyarbakirescort.xyz philippinestravel.network phonezip pine...(PUNT_GEEN_HL)
[uncategorized] ~2370-~2370: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...rk phonezip pine-and-onyx pine-and-onyx.xyz pinupcasino plasticvouchercards.com pla...(PUNT_GEEN_HL)
[uncategorized] ~2374-~2374: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...ouchercards.com playmovies.stream ploki.fr ploooop.com poderfeminino.me pointbuysy...(AFKO_PUNT)
[uncategorized] ~2376-~2376: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ream ploki.fr ploooop.com poderfeminino.me pointbuysys.com poisedtoshrike.com poke...(PUNT_GEEN_HL)
[uncategorized] ~2382-~2382: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...d.com ponpesnuridinidris.com pop3boston.top popautomated.com popularde.top portable...(PUNT_GEEN_HL)
[uncategorized] ~2386-~2386: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ....top portablespeaker.club portail-malin.fr portonomer.com postbinance.net powersho...(AFKO_PUNT)
[uncategorized] ~2393-~2393: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...prayforgem.com prehers.com premium-mail.fr primesempresbuscando.org printemailtext...(AFKO_PUNT)
[uncategorized] ~2408-~2408: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ushmail.fun pushpophop.com pystyportfel.pl pzdiyarsescortbul.xyz qqaonwin quantumn...(PUNT_GEEN_HL)
[style] ~2415-~2415: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...meme.com qwertylock.com r2mcreation.com rachelegriegorealestateagentsantafenm.com radities.com ragnortheblue.com raja...(ERG_LANG_WOORD)
[uncategorized] ~2443-~2443: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...xyz ropainterior-ck.com rospotrebnadzor.ru rowrowleft.com rta.cat rupayamail.com r...(PUNT_GEEN_HL)
[uncategorized] ~2454-~2454: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...diyarescort21.xyz samedayloan sanaglobe.de sancto.xyz sanjose33.com saudidiving.com savin...(DE_ONVERWACHT)
[uncategorized] ~2464-~2464: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...kmail.com scoldly.com sd-152415.dedibox.fr sd-152424.dedibox.fr searchenginerank s...(AFKO_PUNT)
[uncategorized] ~2465-~2465: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ... sd-152415.dedibox.fr sd-152424.dedibox.fr searchenginerank seattle-mail1.top seco...(AFKO_PUNT)
[style] ~2486-~2486: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... shavers.hair shavers.plus shavers.skin sheripatmanrealestateagentfortworthtx.com shoesjp.com shopjp.org shoppingdigi...(ERG_LANG_WOORD)
[uncategorized] ~2496-~2496: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...impleklean skad-tabletki-na-odchudzanie.top skywardhub.online smartinvestment.homes...(PUNT_GEEN_HL)
[uncategorized] ~2502-~2502: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...fttoiletpaper.com solarchargecontroller.club solarinverter.club solarpowered.online ...(PUNT_GEEN_HL)
[uncategorized] ~2509-~2509: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...allads.com spinrewriter.app spotifygold.ir spuramexico2012.net staffingzone.xyz st...(PUNT_GEEN_HL)
[uncategorized] ~2512-~2512: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...12.net staffingzone.xyz stars-and-glory.top stopstress.shop storejp straightenersau...(PUNT_GEEN_HL)
[style] ~2519-~2519: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... successmarketplace.com sunglassescheap sunnipouncilrealestateagentedmondok.com sunnipouncilrealestateagentoklahoma...(ERG_LANG_WOORD)
[style] ~2520-~2520: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...sunnipouncilrealestateagentedmondok.com sunnipouncilrealestateagentoklahomacityok.com sunnyvale33.com supportapp.click su...(ERG_LANG_WOORD)
[style] ~2532-~2532: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...adalafil take-ur-vites.org talatalk.com tamaradorrisrealestateagentcarmichaelca.com tamaradorrisrealestateagentelkgrove...(ERG_LANG_WOORD)
[style] ~2533-~2533: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...radorrisrealestateagentcarmichaelca.com tamaradorrisrealestateagentelkgroveca.com tamaradorrisrealestateagentfolsomca...(ERG_LANG_WOORD)
[style] ~2534-~2534: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...maradorrisrealestateagentelkgroveca.com tamaradorrisrealestateagentfolsomca.com tamaradorrisrealestateagentsacramen...(ERG_LANG_WOORD)
[style] ~2535-~2535: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...tamaradorrisrealestateagentfolsomca.com tamaradorrisrealestateagentsacramentoca.com tastyarabicacoffee.com tavon.xyz te...(ERG_LANG_WOORD)
[misspelling] ~2544-~2544: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ... tenofovir terriblecoffee.org texanmail.pw th-vision.net thailandmovers.com thawki...(NL_SIMPLE_REPLACE_PW)
[uncategorized] ~2551-~2551: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tter.online thecaper.click thedailygood.ir thedrywallclub.com thegambol.click theh...(PUNT_GEEN_HL)
[uncategorized] ~2562-~2562: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tillacts.com tlienodclgoqlclt.com tmweb.ru tobu-wedding.com toddard.com tomekamosl...(PUNT_GEEN_HL)
[style] ~2564-~2564: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m tmweb.ru tobu-wedding.com toddard.com tomekamosleyrealestateagentcedarhilltx.com tomekamosleyrealestateagentdesototx...(ERG_LANG_WOORD)
[style] ~2565-~2565: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ekamosleyrealestateagentcedarhilltx.com tomekamosleyrealestateagentdesototx.com tomekamosleyrealestateagentlancaste...(ERG_LANG_WOORD)
[style] ~2566-~2566: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...tomekamosleyrealestateagentdesototx.com tomekamosleyrealestateagentlancastertx.com top1-casino.site topgun.fit topping...(ERG_LANG_WOORD)
[uncategorized] ~2568-~2568: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lestateagentlancastertx.com top1-casino.site topgun.fit toppinggoods.com topstream10...(PUNT_GEEN_HL)
[style] ~2572-~2572: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ggoods.com topstream10.com topxxx69.com tracyfigueroarealestateagentsacramentoca.com tradingcogroup.ir travel-e-store.co...(ERG_LANG_WOORD)
[uncategorized] ~2574-~2574: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ateagentsacramentoca.com tradingcogroup.ir travel-e-store.com travellerapp.click t...(PUNT_GEEN_HL)
[uncategorized] ~2586-~2586: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ick tubered69.com tvtap.fun tw1owebmail.top twowebmail.top twoxxx.top ufficialeairm...(PUNT_GEEN_HL)
[misspelling] ~2610-~2610: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...tacadostanley.com variots.com vblogmail.pw vcams.info veinflower.xyz vet33.com via...(NL_SIMPLE_REPLACE_PW)
[uncategorized] ~2617-~2617: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...gra visagency.online vitobase.com vlspm.ga vocalmajoritynow.com vosos.xyz vuitton ...(PUNT_GEEN_HL)
[uncategorized] ~2661-~2661: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...bananaulx.com yenidiyarbakir2ofisescort.xyz yenidiyaresc76.xyz yenidiyarescucuzbyn0...(PUNT_GEEN_HL)
[uncategorized] ~2679-~2679: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...about.com zt.co.uk zuperious.club zzuma.ru(PUNT_GEEN_HL)
🪛 GitHub Check: Spell Check with Typos
[warning] 125-125:
"pn" should be "on".
[warning] 128-128:
"pn" should be "on".
[warning] 166-166:
"benj" should be "binge".
[warning] 254-254:
"pn" should be "on".
[warning] 285-285:
"pn" should be "on".
[warning] 324-324:
"pn" should be "on".
[warning] 325-325:
"pn" should be "on".
[warning] 329-329:
"pn" should be "on".
[warning] 338-338:
"pn" should be "on".
[warning] 382-382:
"pn" should be "on".🪛 GitHub Actions: Typo Checks
[error] 125-125:
pnshould beon
[error] 128-128:
pnshould beon
[error] 166-166:
benjshould bebinge
[error] 254-254:
pnshould beon
[error] 285-285:
pnshould beon
[error] 324-324:
pnshould beon
[error] 325-325:
pnshould beon
[error] 329-329:
pnshould beon
[error] 338-338:
pnshould beon
[error] 382-382:
pnshould beon
[error] 578-578:
pnshould beon
[error] 616-616:
boxsshould beboxorboxes
[error] 635-635:
gooodshould begood
[error] 643-643:
coffeshould becoffee
[error] 764-764:
pnshould beon
[error] 792-792:
pnshould beon
[error] 1082-1082:
oueueshould bequeue
[error] 1090-1090:
oyushould beyou
[error] 1191-1191:
radeshould beread,raid, orrate
[error] 1434-1434:
ueshould beuseordue
[error] 1438-1438:
pnshould beon
[error] 1453-1453:
pnshould beon
[error] 1542-1542:
wilshould bewillorwell
[error] 1693-1693:
awsomeshould beawesome
[error] 1943-1943:
gruopshould begroup
[error] 1984-1984:
freshould befree
[error] 2111-2111:
stylshould bestyle
125-125:Details
✅ Verification successful
Address pipeline failures for domain typos.
Several domain entries were flagged in pipeline checks as potential typos (e.g.,
.pndomains). While most appear to be intentional TLDs commonly used in spam domains, you might want to verify these specific entries to ensure they're correctly formatted.Also applies to: 254-254, 285-285, 324-324, 325-325, 329-329, 338-338, 382-382, 578-578
🏁 Script executed:
#!/bin/bash # Check if the flagged TLDs are valid echo "Checking validity of flagged TLDs..." echo "pn TLD info:" whois .pn | grep "Domain" | head -5 echo "-----" echo "tk TLD info:" whois .tk | grep "Domain" | head -5Length of output: 435
🏁 Script executed:
#!/bin/bash # Verify that flagged TLDs are listed in IANA's official TLD registry curl -s https://data.iana.org/TLD/tlds-alpha-by-domain.txt | grep -E '^(PN|TK|PW)$' || echo "One or more TLDs not found"Length of output: 94
Pipeline typo flags are false positives: flagged TLDs are valid
Verified via IANA’s official TLD registry that PN, PW, and TK are all registered top‑level domains. You can safely ignore the pipeline warnings for these entries.🧰 Tools
🪛 GitHub Check: Spell Check with Typos
[warning] 125-125:
"pn" should be "on".🪛 GitHub Actions: Typo Checks
[error] 125-125:
pnshould beonclasses/models/FrmSpamCheck.php (1)
3-49: Well-designed abstract class for spam detection.The class provides a solid foundation for implementing various spam detection strategies. It follows good OOP principles with an abstract base class and clear extension points. The public API is simple and focused, while the implementation details are left to subclasses.
classes/controllers/FrmSettingsController.php (1)
78-83: Improved tab label clarity for expanded spam functionality.Changing the tab name from "Captcha" to "Captcha/Spam" better reflects the expanded scope of this settings section, which now includes various spam prevention features beyond just CAPTCHA.
This is a good UI improvement that helps users understand the purpose of this settings tab.
classes/controllers/FrmFormsController.php (2)
1495-1496: Shifted spam protection from honeypot to StopForumSpam APIThis change replaces the honeypot spam settings view with the StopForumSpam settings view, reflecting a strategic change in the default anti-spam approach. This aligns with the PR's goal of enhancing spam prevention through multiple methods.
3163-3165: Added honeypot JavaScript for front-end formsThis enhancement ensures that the honeypot JavaScript is output on the front end (non-admin area), which properly hides honeypot fields from legitimate users while keeping them visible to bots. Good implementation of the conditional check.
classes/helpers/FrmFormsHelper.php (1)
397-397: Changed default anti-spam protection from honeypot to StopForumSpamThe default options now include StopForumSpam integration (disabled by default with value 0) instead of the honeypot technique. This shifts the spam prevention strategy toward API-based validation while requiring explicit user opt-in.
classes/views/frm-forms/spam-settings/stopforumspam.php (1)
1-13: Well-implemented StopForumSpam API settings UIThis new file provides a clean, informative UI for enabling the StopForumSpam integration. The tooltip properly informs users about what data is sent to the external API (IP, email, name), helping them make an informed decision about enabling this feature.
classes/models/FrmUsage.php (2)
221-221: Added honeypot to global settings trackingTracking honeypot usage at the global settings level aligns with the architectural shift where honeypot functionality is now managed more globally rather than per-form.
308-308: Replaced honeypot with StopForumSpam in form-level trackingThe form-level usage tracking now includes StopForumSpam instead of honeypot, which matches the new per-form opt-in approach for StopForumSpam API integration. This change ensures accurate usage statistics.
classes/views/frm-settings/captcha/captcha.php (3)
107-108: Good separation of concerns with a dedicated Spam section.The section header clearly separates the spam prevention options from captcha settings, making the settings organization more intuitive.
109-115: The honeypot implementation includes good user guidance.The use of a tooltip with the honeypot option helps administrators understand what a honeypot is and how it works for spam prevention, including potential limitations with autocomplete.
124-130: Properly escaped textarea content using appropriate helper.The use of
esc_textarea()correctly escapes the blacklist content for secure display in the textarea.classes/models/FrmSpamCheckUseWPComments.php (1)
25-28: LGTM! Proper implementation of the is_enabled method.The method correctly checks for the presence of the wp_spam_check setting in the global settings.
classes/models/FrmValidate.php (2)
18-22: Good documentation for the new option_type property.The property is well-documented with the appropriate PHPDoc format, including the @SInCE tag for version tracking.
44-53: Clean implementation of option type checking.The enhanced
is_option_on()method now supports both global and form-specific settings, maintaining backward compatibility while adding new functionality. The code is clear and well-structured.classes/models/FrmSettings.php (3)
94-100: Good addition of new spam-related properties.The new properties for honeypot, WordPress spam check, blacklist, and whitelist are appropriately added to support the enhanced spam detection features.
174-177: Sensible default values for spam settings.The default values are well-chosen: honeypot enabled by default (better security out-of-the-box), WordPress spam check disabled (opt-in for performance reasons), and empty strings for blacklist/whitelist.
416-429: Complete integration with checkbox settings.The spam-related checkbox settings are properly integrated into the existing checkbox processing logic, ensuring they're correctly saved when updated through the settings form.
classes/models/FrmSpamCheckWPDisallowedWords.php (1)
42-48: Deprecation fallback is fine – but suppress the notice properly
wp_blacklist_check()is deprecated, yet still used as a fallback. Add_deprecated_function()after the call only when running on WP ≥ 5.5 to silence the Psalm warning without affecting behaviour.🧰 Tools
🪛 GitHub Check: Psalm
[failure] 47-47: DeprecatedFunction
classes/models/FrmSpamCheckWPDisallowedWords.php:47:10: DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)classes/models/FrmHoneypot.php (1)
176-185: Potential collision when multiple forms share identical highest field IDs
get_honeypot_field_id()always returnsmax_id + 1based only on the fields present in the current form.
Imagine two different forms on the same page, both whose highest real field ID is123.
Each form will produce a honeypot field with ID124, resulting in duplicate HTML IDs (#frm_field_124_container) and identical selectors in$frm_vars['honeypot_selectors'], which in turn yields invalid duplicated markup.A lightweight fix is to include the form‑ID in the generated honeypot field ID (or key) to guarantee uniqueness across multiple forms on the same page.
- return $max + 1; + return (int) $this->form_id . ( $max + 1 );Alternatively, append
"_hp"suffix to the HTMLid/selector, decoupling it from the numeric value.Would you like me to supply a patch that covers both render & validate paths?
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (4)
classes/models/FrmSpamCheckBlacklist.php (3)
190-196:⚠️ Potential issueIncorrect callback-argument packing causes undefined index.
The
single_line_check_ip()function expects$args['ip'], but you're passing a nested array which will cause an undefined index error.- $is_spam = $this->read_lines_and_check( $file, array( $this, 'single_line_check_ip' ), array( compact( 'ip' ) ) ); + $is_spam = $this->read_lines_and_check( $file, array( $this, 'single_line_check_ip' ), compact( 'ip' ) );
30-36:⚠️ Potential issueKey name mismatch will cause lookup failure.
The array is initialized with
field_typebut later code inget_field_ids_to_check()expectsfields. This will cause the blacklist to silently fail when field filtering is attempted.- 'field_type' => array(), + 'fields' => array(),
156-164:⚠️ Potential issueLogic inversion will skip every check.
The conditional logic in the field checking is inverted. When
$field_ids_to_checkisfalse(meaning no filtering required), all fields should be checked, not skipped.- if ( false === $field_ids_to_check || in_array( $sub_key, $field_ids_to_check, true ) ) { - continue; - } + if ( false !== $field_ids_to_check && ! in_array( $sub_key, $field_ids_to_check, true ) ) { + continue; + }And also make the same change for the non-repeater branch:
- } elseif ( false === $field_ids_to_check || in_array( $key, $field_ids_to_check, true ) ) { - $values_to_check[] = is_array( $value ) ? implode( ' ', $value ) : $value; + } elseif ( false === $field_ids_to_check || in_array( $key, $field_ids_to_check, true ) ) { + $values_to_check[] = is_array( $value ) ? implode( ' ', $value ) : $value;classes/models/FrmEntryValidate.php (1)
319-319:⚠️ Potential issueParameter default violates declared type.
The
$posted_fieldsparameter defaults tofalsewhich conflicts with the expected array type and triggers static analysis errors.-public static function spam_check( $exclude, $values, &$errors, $posted_fields = false ) { +public static function spam_check( $exclude, $values, &$errors, $posted_fields = array() ) {🧰 Tools
🪛 GitHub Check: PHPStan
[failure] 319-319:
Default value of the parameter #4 $posted_fields (false) of method FrmEntryValidate::spam_check() is incompatible with type array.
🧹 Nitpick comments (5)
classes/controllers/FrmAntiSpamController.php (3)
54-58: Fix theisset()check to prevent static analysis warning.The current implementation of
extract_emails_from_values()triggers a static analysis warning becauseisset($matches[0])always evaluates to true when$matchesis defined with the structure frompreg_match_all().- return isset( $matches[0] ) ? $matches[0] : array(); + return !empty( $matches[0] ) ? $matches[0] : array();🧰 Tools
🪛 GitHub Check: PHPStan
[failure] 57-57:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.
34-37: Double semicolon in the code.There's a typo in line 36 with a double semicolon at the end of the statement.
- return $spam_check->is_spam();; + return $spam_check->is_spam();
65-67: Consider expanding the whitelist IP logic.The whitelist IP implementation is minimal. Consider adding support for reading from settings or making it more robust by supporting CIDR notation like the blacklist implementation does.
classes/models/FrmSpamCheckBlacklist.php (1)
203-206: Consider improving CIDR IP range checking.The current IP check implementation only handles exact matches and a very simplistic form of CIDR notation. A more robust implementation would actually calculate if an IP falls within a CIDR range.
You could add a method like:
private function is_ip_in_cidr($ip, $cidr) { // Split CIDR notation list($subnet, $mask) = explode('/', $cidr); // Convert to binary and apply mask $ip_binary = ip2long($ip); $subnet_binary = ip2long($subnet); $mask_binary = -1 << (32 - $mask); // Check if IP is in subnet return ($ip_binary & $mask_binary) === ($subnet_binary & $mask_binary); }Then update
single_line_check_ip()to use this method when a CIDR format is detected.classes/models/FrmEntryValidate.php (1)
407-410: Double semicolon in blacklist_check method.There's an extra semicolon at the end of line 407.
- $check = new FrmBlacklistSpamCheck( $values['form_id'] );; + $check = new FrmBlacklistSpamCheck( $values['form_id'] );
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
_typos.tomlis excluded by!**/*.toml
📒 Files selected for processing (4)
classes/controllers/FrmAntiSpamController.php(1 hunks)classes/models/FrmEntryValidate.php(4 hunks)classes/models/FrmSpamCheck.php(1 hunks)classes/models/FrmSpamCheckBlacklist.php(1 hunks)
🧰 Additional context used
🪛 GitHub Check: PHPStan
classes/controllers/FrmAntiSpamController.php
[failure] 57-57:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.
classes/models/FrmEntryValidate.php
[failure] 319-319:
Default value of the parameter #4 $posted_fields (false) of method FrmEntryValidate::spam_check() is incompatible with type array.
🪛 GitHub Check: Psalm
classes/models/FrmEntryValidate.php
[failure] 317-317: InvalidParamDefault
classes/models/FrmEntryValidate.php:317:12: InvalidParamDefault: Default value type false for argument 4 of method FrmEntryValidate::spam_check does not match the given type array<array-key, mixed> (see https://psalm.dev/062)
🔇 Additional comments (6)
classes/models/FrmSpamCheck.php (1)
1-32: Well-designed abstract base class for spam detection.This abstract class provides a clean foundation for implementing various spam check strategies. It follows good OOP principles with a clear separation of responsibilities and a well-defined interface.
classes/controllers/FrmAntiSpamController.php (2)
12-17: Good implementation of centralized spam checking.The
is_spam()method effectively centralizes different spam detection strategies with short-circuit evaluation for better performance.
44-46: Localization considerations for spam message.The spam message is correctly localized, making it easy to translate.
classes/models/FrmSpamCheckBlacklist.php (1)
54-60: Good logical structure in the check method.The method first checks IP-based blacklisting and then falls back to content checks, which is efficient and logical.
classes/models/FrmEntryValidate.php (2)
330-333: Good integration with the new spam controller.The usage of
FrmAntiSpamController::is_spam()andFrmAntiSpamController::get_spam_message()centralizes the spam detection logic and makes the code more maintainable.
497-500: Good design decision to make helper methods public.Changing the visibility of helper methods from private to public improves code reusability and supports external usage, which is a good design decision.
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
classes/models/FrmEntryValidate.php (1)
319-319:⚠️ Potential issueFix parameter type mismatch in spam_check method.
The
$posted_fieldsparameter has a default value offalsebut is documented as an array, causing static analysis tools to report an error.-public static function spam_check( $exclude, $values, &$errors, $posted_fields = false ) { +public static function spam_check( $exclude, $values, &$errors, $posted_fields = array() ) {This change ensures that the default value matches the expected type in the documentation.
🧰 Tools
🪛 GitHub Check: PHPStan
[failure] 319-319:
Default value of the parameter #4 $posted_fields (false) of method FrmEntryValidate::spam_check() is incompatible with type array.
🧹 Nitpick comments (7)
classes/controllers/FrmAntiSpamController.php (3)
54-58: Improve email extraction regex and error handling.The current email regex pattern is simple but may not capture all valid email formats, and the array index check could be improved.
public static function extract_emails_from_values( $values ) { $values = FrmAppHelper::maybe_json_encode( $values ); - preg_match_all( '/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $values, $matches ); - return isset( $matches[0] ) ? $matches[0] : array(); + preg_match_all( '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/i', $values, $matches ); + return empty( $matches[0] ) ? array() : $matches[0]; }The improved regex pattern better matches standard email formats with domains, and
empty()is more appropriate thanisset()since we're checking if the array has values.🧰 Tools
🪛 GitHub Check: PHPStan
[failure] 57-57:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.
65-67: Consider enhancing the whitelist IP implementation.The current whitelist IP implementation is minimal and doesn't account for common local development scenarios.
public static function get_whitelist_ip() { - return array( '', '127.0.0.1' ); + return apply_filters( + 'frm_whitelist_ip', + array( '', '127.0.0.1', '::1', '192.168.0.1', '10.0.0.1' ) + ); }This change adds more common local IP addresses and provides a filter for developers to customize the whitelist.
13-16: Consider adding logging for spam detections.The centralized spam detection doesn't include any logging, which could be useful for troubleshooting and monitoring.
You might want to add logging to identify which spam check is triggering. For example:
public static function is_spam( $values ) { + $is_spam = false; + $spam_source = ''; + + if ( self::contains_wp_disallowed_words( $values ) ) { + $is_spam = true; + $spam_source = 'wp_disallowed_words'; + } elseif ( self::is_blacklist_spam( $values ) ) { + $is_spam = true; + $spam_source = 'blacklist'; + } elseif ( self::is_stopforumspam_spam( $values ) ) { + $is_spam = true; + $spam_source = 'stopforumspam'; + } elseif ( self::is_wp_comment_spam( $values ) ) { + $is_spam = true; + $spam_source = 'wp_comments'; + } + + if ( $is_spam && defined( 'WP_DEBUG' ) && WP_DEBUG ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log + error_log( 'Formidable Forms spam detected via: ' . $spam_source ); + } + + return $is_spam; - return self::contains_wp_disallowed_words( $values ) || - self::is_blacklist_spam( $values ) || - self::is_stopforumspam_spam( $values ) || - self::is_wp_comment_spam( $values ); }tests/phpunit/misc/test_FrmSpamCheckWPDisallowedWords.php (2)
34-37: Improve test robustness by handling edge cases better.The current test skips if the WordPress blacklist check fails, which might mask real issues.
$wp_test = $this->run_private_method( array( 'FrmEntryValidate', 'check_disallowed_words' ), array( 'Author', 'author@gmail.com', '', $blocked, $ip, FrmAppHelper::get_server_value( 'HTTP_USER_AGENT' ) ) ); if ( ! $wp_test ) { - $this->markTestSkipped( 'WordPress blacklist check is failing in some cases' ); + $this->markTestIncomplete( 'WordPress disallowed words check failed, possibly due to environment configuration or WordPress version. Check: ' . $blocked ); }Using
markTestIncomplete()provides more context and clarity that this is an expected limitation rather than just skipping.
57-61: Enhance the WordPress version compatibility helper.The method for determining the disallowed words option name relies on checking if the option exists, which could have edge cases.
private function get_disallowed_option_name() { - $keys = get_option( 'disallowed_keys' ); - // Fallback for WP < 5.5. - return false === $keys ? 'blacklist_keys' : 'disallowed_keys'; + global $wp_version; + + // WordPress 5.5+ uses 'disallowed_keys', earlier versions use 'blacklist_keys' + if ( version_compare( $wp_version, '5.5', '>=' ) ) { + return 'disallowed_keys'; + } + + return 'blacklist_keys'; }This approach is more reliable as it directly checks the WordPress version rather than depending on the existence of an option.
classes/models/FrmEntryValidate.php (2)
331-332: Fix comment formatting issue.The inline TODO comment after the statement is causing a PHPCS warning.
elseif ( FrmAntiSpamController::is_spam( $values ) ) { - $errors['spam'] = $spam_msg; // TODO: maybe restore old blacklist spam message. + // TODO: maybe restore old blacklist spam message. + $errors['spam'] = $spam_msg; }This change moves the TODO comment to its own line before the statement, which follows the coding standards.
🧰 Tools
🪛 GitHub Actions: Inspections
[error] 332-332: PHPCS: Comments may not appear after statements (Squiz.Commenting.PostStatementComment.Found)
406-408: Consider logging when spam is detected via the blacklist check.The blacklist check code now simply calls the controller methods, but it doesn't provide any information about which specific rule triggered the spam detection.
public static function blacklist_check( $values ) { - return FrmAntiSpamController::contains_wp_disallowed_words( $values ) || FrmAntiSpamController::is_blacklist_spam( $values ); + $is_wp_disallowed = FrmAntiSpamController::contains_wp_disallowed_words( $values ); + $is_blacklist_spam = FrmAntiSpamController::is_blacklist_spam( $values ); + + if ( $is_wp_disallowed || $is_blacklist_spam ) { + do_action( 'frm_spam_detected', array( + 'wp_disallowed' => $is_wp_disallowed, + 'blacklist' => $is_blacklist_spam, + 'values' => $values, + )); + } + + return $is_wp_disallowed || $is_blacklist_spam; }This change adds a hook that other code can use to respond when spam is detected, while maintaining backward compatibility.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (8)
classes/controllers/FrmAntiSpamController.php(1 hunks)classes/models/FrmEntryValidate.php(4 hunks)classes/models/FrmSpamCheck.php(1 hunks)classes/models/FrmSpamCheckBlacklist.php(1 hunks)classes/models/FrmSpamCheckStopforumspam.php(1 hunks)tests/phpunit/fields/test_FrmFieldValidate.php(0 hunks)tests/phpunit/misc/test_FrmSpamCheckBlacklist.php(1 hunks)tests/phpunit/misc/test_FrmSpamCheckWPDisallowedWords.php(1 hunks)
💤 Files with no reviewable changes (1)
- tests/phpunit/fields/test_FrmFieldValidate.php
🚧 Files skipped from review as they are similar to previous changes (3)
- classes/models/FrmSpamCheck.php
- classes/models/FrmSpamCheckStopforumspam.php
- classes/models/FrmSpamCheckBlacklist.php
🧰 Additional context used
🧬 Code Graph Analysis (1)
classes/controllers/FrmAntiSpamController.php (6)
classes/models/FrmEntryValidate.php (1)
spam_check(319-342)classes/models/FrmSpamCheckStopforumspam.php (1)
FrmSpamCheckStopforumspam(3-50)classes/models/FrmSpamCheckUseWPComments.php (1)
FrmSpamCheckUseWPComments(3-29)classes/models/FrmSpamCheckWPDisallowedWords.php (1)
FrmSpamCheckWPDisallowedWords(3-53)classes/models/FrmSpamCheckBlacklist.php (1)
FrmSpamCheckBlacklist(3-237)classes/helpers/FrmAppHelper.php (2)
FrmAppHelper(6-4462)maybe_json_encode(3278-3283)
🪛 GitHub Actions: PHPUnit
tests/phpunit/misc/test_FrmSpamCheckBlacklist.php
[error] 14-14: PHP Fatal error: syntax error, unexpected '}' causing test suite to fail during PHPUnit run.
🪛 GitHub Actions: Inspections
tests/phpunit/misc/test_FrmSpamCheckBlacklist.php
[error] 7-7: PHPCS: There should be no space between the array opener and closer for an empty array. Found: multiple new lines (NormalizedArrays.Arrays.ArrayBraceSpacing.EmptyArraySpacing)
[error] 12-12: PHPCS: Equals sign not aligned with surrounding assignments; expected 5 spaces but found 1 space (Generic.Formatting.MultipleStatementAlignment.NotSameWarning)
[error] 14-14: PHPCS: PHP syntax error: syntax error, unexpected token "}" (Generic.PHP.Syntax.PHPSyntax)
classes/models/FrmEntryValidate.php
[error] 332-332: PHPCS: Comments may not appear after statements (Squiz.Commenting.PostStatementComment.Found)
🪛 GitHub Check: PHPStan
classes/controllers/FrmAntiSpamController.php
[failure] 57-57:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.
classes/models/FrmEntryValidate.php
[failure] 319-319:
Default value of the parameter #4 $posted_fields (false) of method FrmEntryValidate::spam_check() is incompatible with type array.
🪛 GitHub Check: Psalm
classes/models/FrmEntryValidate.php
[failure] 317-317: InvalidParamDefault
classes/models/FrmEntryValidate.php:317:12: InvalidParamDefault: Default value type false for argument 4 of method FrmEntryValidate::spam_check does not match the given type array<array-key, mixed> (see https://psalm.dev/062)
🪛 GitHub Actions: Psalm Code Analysis
classes/models/FrmEntryValidate.php
[error] 317-317: Psalm error: InvalidParamDefault - Default value type false for argument 4 of method FrmEntryValidate::spam_check does not match the given type array<array-key, mixed>.
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: Cypress
There was a problem hiding this comment.
Actionable comments posted: 3
♻️ Duplicate comments (5)
classes/models/FrmSpamCheckBlacklist.php (5)
33-38:⚠️ Potential issueFix field key name mismatch causing lookup failure
There's a key name inconsistency in the blacklist array definition. You're using
'field_type'here, but later in the code (line 192-194) you're trying to access it using$field_ids_to_check. This mismatch causes the blacklist silently failing to select any fields.- 'field_type' => array(), + 'fields' => array(),🧰 Tools
🪛 GitHub Actions: Inspections
[error] 33-241: 9 errors including array double arrow alignment issues, missing end comment for long condition, and comments appearing after statements.
192-195:⚠️ Potential issueLogic inversion skips every check in repeater fields
The current condition continues (skips processing) when
$field_ids_to_checkisfalseor when the field ID is in the list, which is the opposite of what's needed. If no field filter is supplied, all values should be checked, not skipped.- if ( false === $field_ids_to_check || in_array( $sub_key, $field_ids_to_check, true ) ) { - continue; - } + if ( false !== $field_ids_to_check && ! in_array( $sub_key, $field_ids_to_check, true ) ) { + continue; + }
230-230:⚠️ Potential issueIncorrect callback-argument packing causes undefined index
The current code wraps the IP argument in an extra array, causing
single_line_check_ip()to receive an unexpected argument structure. It's looking for$args['ip']but will get a nested array instead.- $is_spam = $this->read_lines_and_check( $file, array( $this, 'single_line_check_ip' ), array( compact( 'ip' ) ) ); + $is_spam = $this->read_lines_and_check( $file, array( $this, 'single_line_check_ip' ), compact( 'ip' ) );
111-112:⚠️ Potential issueInconsistent key name in fill_default_blacklist_data method
The default blacklist data uses
field_typebut earlier issues showed we needfields. This should be consistent.- 'field_type' => array(), + 'fields' => array(),
198-200:⚠️ Potential issueLogic inversion skips every check in regular fields
Similar to the previous issue with repeater fields, the condition for regular fields also has inverted logic that causes the blacklist check to skip every field.
- } elseif ( false === $field_ids_to_check || in_array( $key, $field_ids_to_check, true ) ) { - $values_to_check[] = is_array( $value ) ? implode( ' ', $value ) : $value; - } + } elseif ( false === $field_ids_to_check || in_array( $key, $field_ids_to_check, true ) ) { + $values_to_check[] = is_array( $value ) ? implode( ' ', $value ) : $value; + }I notice the logic for regular fields (shown above) doesn't have the same issue as with repeater fields. This is inconsistent - either both should check or both should skip based on the same condition.
🧹 Nitpick comments (6)
classes/models/FrmSpamCheckBlacklist.php (5)
30-31: Implement the TODO comment for the filterYou have a TODO comment about adding a filter for blacklist data, but the filter is actually implemented at line 48. The comment should be removed.
- // TODO: add the filter.
48-48: Update filter hook name to match class nameThe filter hook
frm_blacklist_datadoesn't match the class name or the module function. Consider using a more specific name likefrm_spam_blacklist_data.- return apply_filters( 'frm_blacklist_data', $blacklist_data ); + return apply_filters( 'frm_spam_blacklist_data', $blacklist_data, $this->values );
105-115: Add whitelist to default blacklist dataThe
whitelistproperty is set incheck_values()but not included in the default blacklist data, which could cause issues if it's referenced before being set.$blacklist = wp_parse_args( $blacklist, array( 'file' => '', 'words' => array(), 'field_type' => array(), 'compare' => self::COMPARE_CONTAINS, 'extract_value' => '', + 'whitelist' => array(), ) );
1-3: Add class documentationThis class lacks proper PHPDoc documentation. Adding documentation would improve maintainability and provide clarity about the class's purpose and behavior.
<?php +/** + * Class for spam checking using blacklists. + * + * This class handles spam detection by comparing form values against blacklisted words + * and checking the submitter's IP against blacklisted IPs. + * + * @since x.x + */ class FrmSpamCheckBlacklist extends FrmSpamCheck {
241-242: Improve IP check with CIDR format supportThe current IP check has basic support for IP ranges in "x.x.x.x/y" format, but it doesn't actually perform CIDR subnet checks. It only checks if an IP starts with the same pattern.
- private function single_line_check_ip( $line, $args ) { - $ip = $args['ip']; - return $ip === $line || 0 === strpos( $ip . '/', $line ); // Maybe IP in line is x.x.x.x/12 format. - } + private function single_line_check_ip( $line, $args ) { + $ip = $args['ip']; + // Exact match + if ( $ip === $line ) { + return true; + } + + // CIDR format check + if ( strpos( $line, '/' ) !== false ) { + list( $subnet, $mask ) = explode( '/', $line ); + if ( is_numeric( $mask ) ) { + $ip_long = ip2long( $ip ); + $subnet_long = ip2long( $subnet ); + $mask_long = ~( ( 1 << ( 32 - $mask ) ) - 1 ); + return ( $ip_long & $mask_long ) === ( $subnet_long & $mask_long ); + } + } + + return false; + }tests/phpunit/misc/test_FrmSpamCheckBlacklist.php (1)
21-21: Fix PHP coding standards issue with return type declarationThere should be no space before the colon in a return type declaration.
- public function setUp() : void { + public function setUp(): void {🧰 Tools
🪛 GitHub Actions: Inspections
[error] 21-236: 25 coding standard errors including spacing before colon in return type, alignment issues with equals signs and array double arrows, and missing commas after last array items in multi-line arrays.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
classes/models/FrmSpamCheckBlacklist.php(1 hunks)tests/phpunit/misc/blacklist-email-contain.txt(1 hunks)tests/phpunit/misc/test_FrmSpamCheckBlacklist.php(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- tests/phpunit/misc/blacklist-email-contain.txt
🧰 Additional context used
🪛 GitHub Actions: Inspections
classes/models/FrmSpamCheckBlacklist.php
[error] 33-241: 9 errors including array double arrow alignment issues, missing end comment for long condition, and comments appearing after statements.
tests/phpunit/misc/test_FrmSpamCheckBlacklist.php
[error] 21-236: 25 coding standard errors including spacing before colon in return type, alignment issues with equals signs and array double arrows, and missing commas after last array items in multi-line arrays.
⏰ Context from checks skipped due to timeout of 90000ms (3)
- GitHub Check: PHP 8 tests in WP trunk
- GitHub Check: Cypress
- GitHub Check: PHP 7.4 tests in WP trunk
🔇 Additional comments (2)
tests/phpunit/misc/test_FrmSpamCheckBlacklist.php (2)
165-174: Ensure test coverage for field type changesThe test verifies that
blacklist_with_nameonly returns values from name fields, but this depends on theget_field_ids_to_checkmethod properly interpreting the field type.If you change from
field_typetofieldsin the main class, ensure these tests account for that change.
237-237:Details
✅ Verification successful
Test blacklist file path may not exist
The test uses a file path (
__DIR__ . '/blacklist-email-contain.txt') that may not exist in the repository. This could cause test failures.
🏁 Script executed:
#!/bin/bash # Check if the blacklist test file exists if [ -f "tests/phpunit/misc/blacklist-email-contain.txt" ]; then echo "✅ Test blacklist file exists" cat "tests/phpunit/misc/blacklist-email-contain.txt" else echo "❌ Test blacklist file does not exist at tests/phpunit/misc/blacklist-email-contain.txt" # Search for any *.txt files in the test directory that might be used instead echo "Searching for potential alternative test files:" find tests/phpunit/misc -name "*.txt" -type f fiLength of output: 197
Test blacklist file path is valid
The filetests/phpunit/misc/blacklist-email-contain.txtexists and contains the expected entries (wordpress,plugin), so no change is needed.
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (1)
classes/models/FrmHoneypot.php (1)
101-127: 🛠️ Refactor suggestionAvoid optional-chaining for wider browser support & improve CSS escaping.
The JavaScript in
maybe_print_honeypot_js()uses the optional-chaining operator (?.) which isn't supported in older browsers that WordPress may still support. Also, usingesc_js()withdocument.createTextNode()causes unnecessary double-escaping.- document.currentScript?.remove(); + if ( document.currentScript ) { + document.currentScript.parentNode.removeChild( document.currentScript ); + } - style.appendChild( document.createTextNode( '%s' ) ); + style.appendChild( document.createTextNode( %s ) ); - </script>", - esc_js( $styles ) + </script>", + wp_json_encode( $styles )
🧹 Nitpick comments (4)
classes/models/FrmSpamCheckWPDisallowedWords.php (2)
5-27: Implementation looks good but consider adding entry validation.The
check()method is well-structured, collecting all necessary data before passing it to WordPress's disallowed words check.Consider adding a validation check before accessing
$this->valuesto ensure it's properly set and is an array, which would make the code more robust.public function check() { $mod_keys = trim( $this->get_disallowed_words() ); if ( empty( $mod_keys ) ) { return false; } + if ( empty( $this->values ) || ! is_array( $this->values ) ) { + return false; + } $values = $this->values; $content = FrmEntriesHelper::entry_array_to_string( $values );
57-59: Consider updating filter name to use more inclusive terminology.The filter name
frm_check_blacklistuses deprecated terminology that doesn't align with the rest of the codebase's move to "disallowed words".Consider adding a new filter with updated terminology while maintaining backward compatibility:
protected function is_enabled() { - return apply_filters( 'frm_check_blacklist', true, $this->values ); + $enabled = apply_filters( 'frm_check_blacklist', true, $this->values ); + // New filter name with more inclusive terminology + return apply_filters( 'frm_check_disallowed_words', $enabled, $this->values ); }classes/models/FrmHoneypot.php (2)
27-30: Clean implementation of settings check.The
is_enabled()method provides a clear way to check if the honeypot feature is enabled globally. Consider adding a return type hint for improved code clarity:private static function is_enabled(): bool.
219-243: Consider deprecating the class-based approach.Since you've implemented a new container-based approach for hiding honeypot fields, the class-based methods (
generate_class_name()andget_honeypot_class_name()) appear to be unused in the new implementation. Consider deprecating these methods or adding a comment explaining their continued relevance.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (9)
classes/models/FrmEntryValidate.php(5 hunks)classes/models/FrmHoneypot.php(4 hunks)classes/models/FrmSettings.php(3 hunks)classes/models/FrmSpamCheckBlacklist.php(1 hunks)classes/models/FrmSpamCheckStopforumspam.php(1 hunks)classes/models/FrmSpamCheckUseWPComments.php(1 hunks)classes/models/FrmSpamCheckWPDisallowedWords.php(1 hunks)tests/phpunit/misc/test_FrmHoneypot.php(2 hunks)tests/phpunit/misc/test_FrmSpamCheckBlacklist.php(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (7)
- classes/models/FrmSpamCheckUseWPComments.php
- classes/models/FrmSettings.php
- tests/phpunit/misc/test_FrmHoneypot.php
- classes/models/FrmSpamCheckStopforumspam.php
- classes/models/FrmSpamCheckBlacklist.php
- classes/models/FrmEntryValidate.php
- tests/phpunit/misc/test_FrmSpamCheckBlacklist.php
🧰 Additional context used
🧬 Code Graph Analysis (1)
classes/models/FrmHoneypot.php (3)
classes/models/FrmValidate.php (3)
__construct(27-29)get_option_key(65-65)get_form(34-39)classes/models/FrmField.php (2)
FrmField(6-1501)get_all_for_form(889-928)classes/helpers/FrmAppHelper.php (5)
FrmAppHelper(6-4462)get_settings(172-182)array_to_html_params(1324-1333)generate_new_key(2398-2404)get_simple_request(681-714)
🪛 GitHub Check: Psalm
classes/models/FrmSpamCheckWPDisallowedWords.php
[failure] 54-54: DeprecatedFunction
classes/models/FrmSpamCheckWPDisallowedWords.php:54:10: DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)
🪛 GitHub Actions: Psalm Code Analysis
classes/models/FrmSpamCheckWPDisallowedWords.php
[error] 54-54: Psalm DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)
⏰ Context from checks skipped due to timeout of 90000ms (3)
- GitHub Check: PHP 8 tests in WP trunk
- GitHub Check: PHP 7.4 tests in WP trunk
- GitHub Check: Cypress
🔇 Additional comments (11)
classes/models/FrmSpamCheckWPDisallowedWords.php (2)
34-42: Good backward compatibility implementation for disallowed words.The implementation properly handles both WordPress 5.5+ with
disallowed_keysand older versions withblacklist_keys.
49-55:Details
✅ Verification successful
Function compatibility is correct but uses deprecated code.
The method correctly provides backward compatibility, but note that
wp_blacklist_check()is deprecated as flagged by static analysis tools.While the code includes the appropriate phpcs comment to ignore the deprecation warning, we should check how long this compatibility layer will be needed. Consider running:
If the minimum supported WordPress version is 5.5 or higher, you could simplify this code to only use
wp_check_comment_disallowed_list().
🏁 Script executed:
#!/bin/bash # Check minimum supported WordPress version for this plugin grep -r "MINIMUM_WP_VERSION" --include="*.php" .Length of output: 48
Let’s look for the declared WP requirement in your plugin headers or docs:
🏁 Script executed:
#!/bin/bash # Search for minimum WP version in plugin readme or headers rg -i "Requires at least" -n . rg -i "Tested up to" -n .Length of output: 133
Retain fallback for WP ≤5.4 compatibility
Since your plugin’s “Requires at least” is set to 5.2, the
wp_blacklist_check()call is still required for sites running WP 5.2–5.4. No changes are needed now. If you decide to bump your minimum supported WordPress version to 5.5 or higher, you can simplify this method to always callwp_check_comment_disallowed_list()and remove the deprecated fallback.🧰 Tools
🪛 GitHub Check: Psalm
[failure] 54-54: DeprecatedFunction
classes/models/FrmSpamCheckWPDisallowedWords.php:54:10: DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)🪛 GitHub Actions: Psalm Code Analysis
[error] 54-54: Psalm DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)
classes/models/FrmHoneypot.php (9)
8-18: Good implementation of class properties and constructor.The constructor is well-designed, taking an optional
$fieldsparameter and defaulting to fetching all fields if not provided. This makes the class more flexible and testable. Good use of parent constructor call and field initialization.
47-52: Good approach to honeypot spam detection.The implementation checks both legacy and new honeypot mechanisms, ensuring backward compatibility while introducing more robust detection. The dynamic field ID approach makes the honeypot harder for bots to detect.
54-67: Well-documented filter with improved context.Good job updating the filter documentation to reflect the new fields parameter. The filter now provides more context to developers who might want to customize the honeypot behavior.
94-95: Improved method signature for better flexibility.The updated
maybe_render_field()method now accepts an optional fields parameter, which aligns with the constructor's signature and improves reusability.
139-158: Improved honeypot field implementation with dynamic IDs.The honeypot field implementation has been significantly improved:
- Dynamic field ID generation makes it harder for bots to detect
- Proper container tracking for CSS hiding
- Well-structured HTML with appropriate escaping
- Good use of helper methods for parameter generation
This approach is much more robust than the previous static implementation.
162-169: Good implementation of global tracking for honeypot selectors.Using the global
$frm_varsto track honeypot selectors is a clean approach for collecting elements that need CSS hiding, which will be applied by themaybe_print_honeypot_js()method.
187-189: Good use of random key generation.Using
FrmAppHelper::generate_new_key()to create random keys for honeypot fields makes them less predictable and improves spam detection.
198-212: Secure retrieval of honeypot field values.The method properly uses
FrmAppHelper::get_simple_request()to safely retrieve form data and includes appropriate validation checks before accessing array elements. Good defensive programming by checking if the item_meta is an array.
176-185:Details
✅ Verification successful
Smart approach to generate unique field IDs.
Generating a field ID that's one greater than the maximum existing field ID is a clever way to ensure uniqueness. However, this approach might have edge cases if field IDs aren't sequential or if another process modifies fields concurrently.
Consider verifying that this approach works in all scenarios:
🏁 Script executed:
#!/bin/bash # Find if there are any other places in the code that might be generating field IDs # that could conflict with this approach rg "field.*id.*\+\s*\d+" --type phpLength of output: 322
get_honeypot_field_id() ID generation is safe and well-covered by tests
I searched the codebase and only found one other “+ 1” usage in your PHPUnit test (verifying this method) and a non-conflicting
field_order + 2elsewhere. There are no other competing ID generators that could collide. The existing unit test intests/phpunit/misc/test_FrmHoneypot.phpconfirms the logic.No changes needed here.
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
classes/models/FrmHoneypot.php (1)
135-147: 🛠️ Refactor suggestionFix browser compatibility issue with optional chaining
The JavaScript uses the optional chaining operator (
?.), which isn't supported in older browsers like IE11 or older Android WebViews that WordPress still supports.printf( "<script> ( function() { const style = document.createElement( 'style' ); style.appendChild( document.createTextNode( '%s' ) ); document.head.appendChild( style ); - document.currentScript?.remove(); + if ( document.currentScript ) { + document.currentScript.parentNode.removeChild( document.currentScript ); + } } )(); </script>", esc_js( $css ) );Additionally, consider using
wp_json_encode()instead ofesc_js()to avoid double-escaping:printf( "<script> ( function() { const style = document.createElement( 'style' ); - style.appendChild( document.createTextNode( '%s' ) ); + style.appendChild( document.createTextNode( %s ) ); document.head.appendChild( style ); if ( document.currentScript ) { document.currentScript.parentNode.removeChild( document.currentScript ); } } )(); </script>", - esc_js( $css ) + wp_json_encode( $css ) );
🧹 Nitpick comments (4)
classes/models/FrmHoneypot.php (4)
223-236: Consider optimizing honeypot field ID generationThe current implementation iterates through all form fields to find the maximum field ID and increments it. This could be inefficient for forms with many fields.
Consider using a database query to find the maximum field ID directly, especially for large forms:
private function get_honeypot_field_id() { global $wpdb; // Get the max ID directly from the database $max_id = $wpdb->get_var( $wpdb->prepare( "SELECT MAX(id) FROM {$wpdb->prefix}frm_fields WHERE form_id = %d", $this->form_id ) ); return (int) $max_id + 1; }This would be more efficient for forms with a large number of fields.
8-25: Update version placeholders in docblocksSeveral docblocks use
@since x.xwhich should be replaced with actual version numbers before release.Replace all instances of
@since x.xwith the actual version number for the release (e.g.,@since 5.0).
249-263: Strengthen input validation inget_honeypot_field_value()The method properly checks if
$item_metais an array, but consider adding additional validation.private function get_honeypot_field_value( $field_id ) { $item_meta = FrmAppHelper::get_simple_request( array( 'param' => 'item_meta', 'default' => array(), 'type' => 'post', ) ); if ( ! $item_meta || ! is_array( $item_meta ) ) { return ''; } - return isset( $item_meta[ $field_id ] ) ? $item_meta[ $field_id ] : ''; + return isset( $item_meta[ $field_id ] ) ? sanitize_text_field( $item_meta[ $field_id ] ) : ''; }This ensures any returned value is properly sanitized before being used elsewhere.
153-157: Consider updatingform_is_loaded_by_api()usage and commentsThe method makes an external call to
FrmFormsHelper::form_is_loaded_by_api()with a descriptive comment, but the relationship could be clearer.Add a comment linking to the
form_is_loaded_by_api()implementation or consider adding a local static method if this check is specific to honeypot functionality.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
classes/helpers/FrmFormsHelper.php(2 hunks)classes/models/FrmHoneypot.php(4 hunks)
🧰 Additional context used
🪛 GitHub Actions: Inspections
classes/models/FrmHoneypot.php
[error] 160-160: WordPress.Security.EscapeOutput.OutputNotEscaped: All output should be run through an escaping function, found '$css'.
🪛 GitHub Check: Psalm
classes/helpers/FrmFormsHelper.php
[failure] 1885-1885: UndefinedClass
classes/helpers/FrmFormsHelper.php:1885:11: UndefinedClass: Class, interface or enum named FrmProFormState does not exist (see https://psalm.dev/019)
🪛 GitHub Check: PHPStan
classes/helpers/FrmFormsHelper.php
[failure] 1885-1885:
Call to static method get_from_request() on an unknown class FrmProFormState.
🪛 GitHub Actions: Psalm Code Analysis
classes/helpers/FrmFormsHelper.php
[error] 1885-1885: Psalm: UndefinedClass - Class, interface or enum named FrmProFormState does not exist (see https://psalm.dev/019)
⏰ Context from checks skipped due to timeout of 90000ms (4)
- GitHub Check: PHP 8 tests in WP trunk
- GitHub Check: Run PHP Syntax inspection (8.3)
- GitHub Check: PHP 7.4 tests in WP trunk
- GitHub Check: Cypress
🔇 Additional comments (1)
classes/helpers/FrmFormsHelper.php (1)
396-398: Verify impact of switching default anti-spam optionThe default options now include
'stopforumspam' => 0instead of the previous honeypot option. This represents a shift in the default anti-spam strategy.Make sure this change won't affect existing forms that rely on the honeypot functionality. Consider if a migration path is needed for existing forms, or if the global honeypot setting will ensure backward compatibility.
There was a problem hiding this comment.
Actionable comments posted: 4
♻️ Duplicate comments (1)
tests/phpunit/misc/test_FrmSpamCheckDenylist.php (1)
30-32: 🛠️ Refactor suggestionConsider making the test more self-contained by creating the text field explicitly.
The test fixture relies on an implicit text field created when the form is created. This approach is fragile as it depends on implementation details of form creation that could change.
-$fields = FrmField::getAll( array( 'form_id' => $this->form_id ) ); -$this->text_field_id = $fields[0]->id; +$this->text_field_id = $this->factory->field->create( + array( + 'type' => 'text', + 'form_id' => $this->form_id, + ) +);
🧹 Nitpick comments (3)
tests/phpunit/misc/test_FrmSpamCheckDenylist.php (3)
101-148: Add documentation to describe test coverage.This test method verifies the field filtering logic, but lacks documentation explaining its purpose and the scenarios being tested.
/** + * Test that field IDs are correctly filtered based on denylist configuration. + * + * Covers multiple scenarios: + * - No field type restrictions (all fields) + * - Skipping specific field types + * - Including only specific field types + */ public function test_get_field_ids_to_check() {
150-214: Add documentation to describe test coverage.Similar to the previous method, adding documentation would improve clarity.
/** + * Test that form values are correctly extracted based on denylist configuration. + * + * Covers multiple scenarios: + * - Values from all fields + * - Values from specific field types + * - Values extracted using custom extraction functions + */ public function test_get_values_to_check() {
302-304: Consider using the built-in PHP Unit mocking utilities.Using direct assignment to
$_SERVER['REMOTE_ADDR']for mocking is fragile. Consider using PHPUnit's environment and server variable mocking facilities instead.-$current_ip = $_SERVER['REMOTE_ADDR']; - -// Mock IP address. -$_SERVER['REMOTE_ADDR'] = '192.168.1.1'; +// Save current environment +$original_server = $_SERVER; + +// Mock IP address using PHPUnit +$this->setServerVariable('REMOTE_ADDR', '192.168.1.1');And for the reset at the end of the method:
-// Reset the IP address. -$_SERVER['REMOTE_ADDR'] = $current_ip; +// Restore original environment +$_SERVER = $original_server;
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
classes/models/FrmSpamCheckDenylist.php(1 hunks)tests/phpunit/misc/test_FrmSpamCheckDenylist.php(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- classes/models/FrmSpamCheckDenylist.php
⏰ Context from checks skipped due to timeout of 90000ms (3)
- GitHub Check: Cypress
- GitHub Check: PHP 7.4 tests in WP trunk
- GitHub Check: PHP 8 tests in WP trunk
🔇 Additional comments (1)
tests/phpunit/misc/test_FrmSpamCheckDenylist.php (1)
333-333:Details
❌ Incorrect review comment
Re-enable an important test assertion.
The code reviewer previously found a commented-out assertion related to CIDR matching. Your implementation now tests this functionality, so uncomment the assertion to verify it works correctly.
🏁 Script executed:
#!/bin/bash # Look for any commented assertions related to IP CIDR matching rg -n "//\s*\$this->assertTrue" tests/phpunit/misc/test_FrmSpamCheckDenylist.php rg -n "//\s*\$this->assert" tests/phpunit/misc/test_FrmSpamCheckDenylist.phpLength of output: 159
🏁 Script executed:
#!/bin/bash # Search for commented-out PHPUnit assertions using `#` rg -n '^\s*#.*\$this->assert' tests/phpunit/misc/test_FrmSpamCheckDenylist.php # Search for commented-out PHPUnit assertions inside block comments `/* ... */` rg -n '/\*.*\$this->assert' tests/phpunit/misc/test_FrmSpamCheckDenylist.phpLength of output: 159
No commented-out CIDR assertion found – suggestion not applicable.
I searched for any commented PHPUnit assertions (
//,#, or/* … */) in tests/phpunit/misc/test_FrmSpamCheckDenylist.php and found none. The test only contains the active:$this->assertTrue( $this->run_private_method( array( $this->spam_check, 'check_ip' ) ) );There is no hidden or commented CIDR-matching assertion to re-enable. You can safely ignore this review comment.
Likely an incorrect or invalid review comment.
|
@Crabcyborg I completed everything. Please test again. Now denylist array supports |
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (2)
classes/models/FrmHoneypot.php (2)
142-142: Fix browser compatibility issue with optional chaining.The optional chaining operator (
?.) isn't supported in older browsers like IE11 or older Android WebViews that WordPress claims to support. This was flagged in a previous review but hasn't been addressed.- document.currentScript?.remove(); + if (document.currentScript) { + document.currentScript.parentNode.removeChild(document.currentScript); + }
160-160: Use esc_html instead of esc_attr for CSS output.For CSS output in style tags,
esc_html()is the appropriate escaping function to use, notesc_attr(). This was flagged in a previous review comment.- echo '<style>' . esc_attr( $css ) . '</style>'; + echo '<style>' . esc_html( $css ) . '</style>';
🧹 Nitpick comments (5)
classes/models/FrmHoneypot.php (5)
145-145: Consider using wp_json_encode for safer escaping.Using
esc_js()withdocument.createTextNode()creates double-escaping issues. Consider usingwp_json_encode()instead for better handling of CSS strings.- esc_js( $css ) + wp_json_encode( $css )And also:
- style.appendChild( document.createTextNode( '%s' ) ); + style.appendChild( document.createTextNode( %s ) );
250-256: Consider using FrmAppHelper::get_param instead of get_simple_request.For consistency with other code in the file (like line 97), consider using
FrmAppHelper::get_paramfor retrieving the item_meta parameter.- $item_meta = FrmAppHelper::get_simple_request( - array( - 'param' => 'item_meta', - 'default' => array(), - 'type' => 'post', - ) - ); + $item_meta = FrmAppHelper::get_param('item_meta', array(), 'post', 'wp_kses_post');
114-119: Consider moving the honeypot field position.As mentioned in a previous review comment (line 114), the honeypot field is currently positioned after the submit button, which might be less effective at fooling spam bots. Consider injecting it somewhere among other form fields for better camouflage.
175-177: Consider enhancing honeypot effectiveness with randomized styling.The current CSS approach uses a consistent pattern for hiding honeypot fields. Advanced bots might detect this pattern over time. Consider adding slight variations to the CSS properties or selectors to make detection more difficult.
return sprintf( - '%s {visibility:hidden;overflow:hidden;width:0;height:0;position:absolute;}', + '%s {visibility:hidden;overflow:hidden;width:%dpx;height:%dpx;position:absolute;opacity:0.01;}', implode( ',', $frm_vars['honeypot_selectors'] ), + rand(0, 1), + rand(0, 1) );
8-25: Complete the version number in the @SInCE tags.The
@since x.xtags should be updated with the actual version number when this code will be released.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
psalm.xmlis excluded by!**/*.xml
📒 Files selected for processing (1)
classes/models/FrmHoneypot.php(4 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (3)
- GitHub Check: Cypress
- GitHub Check: PHP 7.4 tests in WP trunk
- GitHub Check: PHP 8 tests in WP trunk
🔇 Additional comments (1)
classes/models/FrmHoneypot.php (1)
223-236: Good job addressing the null iterator issue.You've properly addressed the previously identified issue by ensuring
$fieldsis always an array before iteration.
|
@truongwp A unit test is also breaking.
|
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
tests/cypress/e2e/Entries/EntriesPageDataValidations.cy.js (1)
99-99: Appropriate selector update to exclude honeypot fieldsThe selector has been correctly updated to exclude honeypot fields (
.frm_verify) when typing text during the test. This ensures that the test properly simulates legitimate user behavior by not filling in the honeypot fields that would trigger spam detection.Consider adding a brief comment explaining the purpose of excluding
.frm_verifyfields for future developers:- cy.get('[id^="field_"]:not(.frm_verify)').filter('input, textarea').type("Entry is stored"); + // Exclude honeypot fields (.frm_verify) to prevent triggering spam detection + cy.get('[id^="field_"]:not(.frm_verify)').filter('input, textarea').type("Entry is stored");
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
tests/cypress/e2e/Entries/EntriesPageDataValidations.cy.js(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (2)
- GitHub Check: PHP 7.4 tests in WP trunk
- GitHub Check: Cypress
|
Also @truongwp I got the e2e tests passing on master. So all new tests failing are because of changes in this branch. I pushed some fixes here so it should just be the HTML validation issue left (#2285 (comment)). |
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (2)
classes/models/FrmHoneypot.php (2)
143-147:⚠️ Potential issueFix browser compatibility issue with optional chaining
The optional chaining operator (
?.) is not supported in older browsers that WordPress aims to support. This was previously flagged in code reviews but remains unaddressed.Replace the optional chaining with a more compatible approach:
- document.currentScript?.remove(); + if ( document.currentScript ) { + document.currentScript.parentNode.removeChild( document.currentScript ); + }Additionally, consider using
wp_json_encode()instead ofesc_js()to avoid potential double-escaping of content:- style.appendChild( document.createTextNode( '%s' ) ); + style.appendChild( document.createTextNode( %s ) ); ... - esc_js( $css ) + wp_json_encode( $css )
33-39: 🛠️ Refactor suggestionEnsure fields property always returns an array
The
get_fields()method is correctly implemented, but the PHPDoc indicates it returns an array while there's no guaranteeFrmField::get_all_for_form()will always return an array. You're checking for null arrays later inget_honeypot_field_id(), but it would be better to ensureget_fields()always returns an array.protected function get_fields() { if ( is_null( $this->fields ) ) { $this->fields = FrmField::get_all_for_form( $this->form_id, '', 'include' ); + if ( ! is_array( $this->fields ) ) { + $this->fields = array(); + } } return $this->fields; }
🧹 Nitpick comments (4)
classes/models/FrmHoneypot.php (4)
48-51: Add PHPDoc to the is_enabled() methodThis new method lacks PHPDoc documentation. Maintain consistency with the rest of the codebase by adding appropriate documentation.
+/** + * Checks if honeypot is enabled in global settings. + * + * @since x.x + * + * @return bool True if honeypot is enabled. + */ private static function is_enabled() { $frm_settings = FrmAppHelper::get_settings(); return $frm_settings->honeypot; }
100-107: Consider bypassing honeypot for logged-in users with form entry permissionsBased on the PR objectives, there was a discussion about allowing trusted users to bypass spam checks. Consider adding a permission check for logged-in users with the ability to create entries.
private function check_honeypot_filter() { $form = $this->get_form(); + // Skip honeypot check for users who can create entries + if ( is_user_logged_in() && current_user_can( 'frm_create_entries' ) ) { + return false; + } return apply_filters( 'frm_run_honeypot', true, compact( 'form' ) ); }
227-240: Consider adding a comment explaining honeypot field ID generationThe method for generating honeypot field IDs is good but could benefit from a clear explanation of the strategy used.
/** + * Generate a unique ID for the honeypot field by finding the highest field ID and adding 1. + * This ensures the honeypot field ID won't conflict with existing fields. + * + * @since x.x + * + * @return int A unique field ID for the honeypot field + */ private function get_honeypot_field_id() { $max = 0; $fields = $this->get_fields(); if ( ! is_array( $fields ) ) { $fields = array(); } foreach ( $fields as $field ) { if ( $field->id > $max ) { $max = $field->id; } unset( $field ); } return $max + 1; }
253-267: Add validation for array key type in get_honeypot_field_valueThe method uses array access with
$field_iddirectly without verifying it's an appropriate key type.private function get_honeypot_field_value( $field_id ) { + // Ensure field_id is a valid array key + if ( ! is_scalar( $field_id ) ) { + return ''; + } + $item_meta = FrmAppHelper::get_simple_request( array( 'param' => 'item_meta', 'default' => array(), 'type' => 'post', ) ); if ( ! $item_meta || ! is_array( $item_meta ) ) { return ''; } return isset( $item_meta[ $field_id ] ) ? $item_meta[ $field_id ] : ''; }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (7)
classes/models/FrmHoneypot.php(4 hunks)classes/models/FrmSpamCheck.php(1 hunks)classes/models/FrmSpamCheckDenylist.php(1 hunks)classes/models/FrmSpamCheckUseWPComments.php(1 hunks)classes/models/FrmSpamCheckWPDisallowedWords.php(1 hunks)classes/models/FrmUsage.php(2 hunks)classes/views/frm-forms/spam-settings/stopforumspam.php(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (6)
- classes/models/FrmSpamCheckUseWPComments.php
- classes/views/frm-forms/spam-settings/stopforumspam.php
- classes/models/FrmUsage.php
- classes/models/FrmSpamCheck.php
- classes/models/FrmSpamCheckWPDisallowedWords.php
- classes/models/FrmSpamCheckDenylist.php
⏰ Context from checks skipped due to timeout of 90000ms (3)
- GitHub Check: Cypress
- GitHub Check: PHP 8 tests in WP trunk
- GitHub Check: PHP 7.4 tests in WP trunk
🔇 Additional comments (3)
classes/models/FrmHoneypot.php (3)
180-181: LGTM: CSS syntax error has been fixedThe previous review identified a syntax error in the CSS where a semicolon was missing. This has been correctly fixed in this implementation.
195-216: Verify the position of the honeypot fieldAccording to the review comments, there was a discussion about the position of the honeypot field on the page. This implementation still appears to place it after the submit button (based on how it's rendered separately).
Could you verify if there's a better place to inject the honeypot field in the form layout to make it less conspicuous? The previous discussion suggested placing it as the first field or randomly between fields.
164-164: 🛠️ Refactor suggestionProperly escape CSS output to preserve CSS syntax
While you've added
esc_html()to address the security concern from a previous review, this can break valid CSS. Use WordPress's escape function designed specifically for inline CSS.- echo '<style>' . esc_html( $css ) . '</style>'; + echo '<style>' . wp_strip_all_tags( $css ) . '</style>';This will strip HTML tags while preserving valid CSS syntax, which is safer than using
esc_html()that could escape characters needed for CSS.Likely an incorrect or invalid review comment.
Crabcyborg
left a comment
There was a problem hiding this comment.
Thank you @truongwp!
I'll go ahead and merge this now.
I think it's good to go. If anything else comes up, feel free to make a new PR.
🚀

Related issue: https://github.com/Strategy11/formidable-pro/issues/5675
Handoff: https://linear.app/strategy11/document/feature-handoff-3f2e6a1df62b